Что это за строка?

Строка %') AND EXTRACTVALUE(4681,CONCAT(0x7e,((SELECT (ELT(4681=4681,1)))),0x7e))-- - — это типичный пример SQL-инъекции (SQL injection), а именно инъекции, основанной на ошибках (error-based). Такие payload'ы встречаются в логах веб-серверов, в полях ввода форм и в параметрах URL. Их цель — заставить базу данных вернуть полезную информацию через текст ошибки или выполнить произвольный запрос.

В данном случае злоумышленник пытается проверить, уязвим ли сайт, и, если да, извлечь данные. Разберём каждый элемент.

Разбор payload по частям

1. Начало: %')

Символ % часто используется в LIKE-запросах как шаблон. Конструкция ') закрывает строковый литерал и круглую скобку в исходном SQL-запросе, после чего добавляется оператор AND. Это позволяет внедрить собственное условие в запрос.

2. Функция EXTRACTVALUE()

EXTRACTVALUE(XML_document, XPath_expression) — функция MySQL, которая извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, содержащую результат вычисления выражения. Это ключевой механизм error-based инъекции: злоумышленник может поместить в XPath подзапрос, и его результат попадёт в текст ошибки.

3. CONCAT(0x7e, ..., 0x7e)

0x7e — шестнадцатеричное представление символа ~ (тильда). Функция CONCAT объединяет строки. Здесь она оборачивает результат подзапроса в тильды, чтобы в сообщении об ошибке было легко выделить извлечённые данные (например, версию БД или имя пользователя).

4. Подзапрос (SELECT (ELT(4681=4681,1)))

ELT(N, str1, str2, ...) возвращает строку по номеру N. Выражение 4681=4681 всегда истинно (1), поэтому ELT(1,1) вернёт 1. Это простейшая проверка: если инъекция сработает, в ошибке появится ~1~. В реальной атаке вместо 1 мог бы быть, например, version() или database().

5. Комментарий -- -

Два дефиса с пробелом и ещё одним дефисом — это комментарий в MySQL, который «отрезает» оставшуюся часть оригинального запроса, чтобы синтаксис остался корректным.

Как работает атака?

Предположим, исходный запрос выглядит так:

SELECT * FROM users WHERE name LIKE '%...%'

После подстановки payload'а запрос превращается в:

SELECT * FROM users WHERE name LIKE '%') AND EXTRACTVALUE(4681,CONCAT(0x7e,((SELECT (ELT(4681=4681,1)))),0x7e))-- -%'

База данных выполняет EXTRACTVALUE с некорректным XPath (строка ~1~ не является валидным XPath), что вызывает ошибку вида:

XPATH syntax error: '~1~'

Если сайт отображает ошибки БД, злоумышленник увидит этот текст и поймёт, что инъекция возможна. Далее он заменит 1 на вызовы функций, извлекая данные посимвольно.

Чем опасна error-based инъекция?

Error-based SQL-инъекции считаются одними из самых быстрых и удобных для атакующего: не нужно слепого перебора, результат приходит прямо в ответе сервера. С их помощью можно получить:

  • версию СУБД и текущего пользователя;
  • имена баз данных, таблиц и колонок;
  • содержимое таблиц (логины, пароли, персональные данные).

В худшем случае инъекция приводит к полной компрометации базы данных.

Как защититься?

  1. Параметризованные запросы (prepared statements). Главная мера: никогда не конкатенировать пользовательский ввод в SQL. Используйте плейсхолдеры.
  2. Экранирование и валидация. Если параметризация невозможна, применяйте строгую проверку типов и экранирование спецсимволов.
  3. Отключение вывода ошибок БД. Не показывайте пользователям тексты ошибок СУБД — это резко снижает эффективность error-based атак.
  4. Принцип наименьших привилегий. Учётная запись приложения должна иметь только необходимые права.
  5. WAF и мониторинг. Веб-application firewall может блокировать известные payload'ы, а логи помогут заметить атаку.

Вывод

Строка %') AND EXTRACTVALUE(4681,CONCAT(0x7e,((SELECT (ELT(4681=4681,1)))),0x7e))-- - — это не случайный набор символов, а осмысленный эксплойт для проверки error-based SQL-инъекции. Если вы встретили её в логах, значит, ваш сайт пытались просканировать на уязвимость. Убедитесь, что все запросы к БД параметризованы, а сообщения об ошибках не попадают к пользователю.

Источники