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

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

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

Давайте разберём каждый элемент этой инъекции.

  • %'))) — это начало, которое часто используется для «закрытия» предыдущих кавычек и скобок в уязвимом SQL-запросе. Символ % может быть частью URL-кодирования или просто мусором для обхода простых фильтров. Далее идут закрывающие кавычка и скобки, чтобы синтаксис стал корректным.
  • AND — логический оператор, присоединяющий наше условие к оригинальному запросу.
  • EXTRACTVALUE(8704, ...) — вызов функции MySQL, которая извлекает значение из XML-документа по XPath-выражению. Первый аргумент (8704) — это произвольное число, которое не влияет на результат, но нужно для синтаксиса. Второй аргумент — XPath-выражение, которое мы формируем.
  • CONCAT(0x7e, ..., 0x7e) — функция конкатенации. 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильда добавляется в начало и конец, чтобы отделить полезную нагрузку в сообщении об ошибке.
  • (SELECT (ELT(8704=8704,1))) — подзапрос, возвращающий значение. ELT() — функция, возвращающая N-й элемент из списка. Здесь 8704=8704 — всегда истинное условие (1), поэтому ELT(1,1) вернёт 1. Это простейший пример, но на практике вместо 1 подставляются имена таблиц, колонок или другие данные.
  • -- - — комментарий, который «съедает» оставшуюся часть оригинального запроса, чтобы не возникало синтаксических ошибок.

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

MySQL при попытке разобрать XPath-выражение, содержащее недопустимые символы (например, тильду), генерирует ошибку вида: XPATH syntax error: '~1~'. Эта ошибка возвращается клиенту. Злоумышленник, видя её, понимает, что инъекция сработала, и может заменить 1 на любой другой запрос, например, (SELECT database()), чтобы получить имя текущей базы данных. Таким образом, через ошибки можно пошагово извлекать произвольную информацию.

Пример ошибки: ERROR 1105 (HY000): XPATH syntax error: '~1~'

Важно: функция EXTRACTVALUE удалена в MySQL 8.0.4 и заменена на UPDATEXML, но в старых версиях (5.7 и ниже) она всё ещё работает. Именно поэтому подобные payload'ы встречаются в старых системах.

Зачем это нужно злоумышленнику

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

  • версию MySQL,
  • имя текущей базы данных,
  • список таблиц и колонок,
  • непосредственно данные (логины, пароли, персональную информацию).

Строка с ELT(8704=8704,1) — это тестовый запрос, чтобы убедиться, что инъекция возможна. Если ошибка появляется, значит, приложение уязвимо.

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

Основные меры противодействия:

  1. Использовать подготовленные выражения (prepared statements) с параметризацией — это самый надёжный способ.
  2. Экранировать все пользовательские данные перед вставкой в SQL-запрос.
  3. Отключить вывод ошибок СУБД на продакшене, чтобы злоумышленник не получал подсказок.
  4. Регулярно обновлять MySQL до версии 8.0.4+, где EXTRACTVALUE удалена.
  5. Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.

Если вы обнаружили такую строку в логах, это сигнал о попытке взлома. Необходимо срочно проверить код приложения на наличие уязвимостей и провести аудит безопасности.

Вывод

Строка %'))) AND EXTRACTVALUE(8704,CONCAT(0x7e,((SELECT (ELT(8704=8704,1)))),0x7e))-- - — это типичный пример эксплуатации error-based SQL-инъекции в MySQL через функцию EXTRACTVALUE. Она демонстрирует, как можно использовать ошибки XPath для извлечения данных. Понимание таких конструкций важно для специалистов по безопасности и разработчиков, чтобы своевременно закрывать уязвимости.

Источники