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

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

Подобные строки часто встречаются в логах веб-серверов, в отчётах систем обнаружения вторжений (IDS) или в базах уязвимостей. Они не являются вредоносным кодом сами по себе — это попытка эксплуатации уязвимости, которая возникает, когда приложение небезопасно подставляет пользовательский ввод в SQL-запрос.

Как работает эта инъекция?

Разберём строку по частям:

  • %") — начало полезной нагрузки. Символ % часто используется в поисковых запросах (LIKE), а ") закрывает строковый литерал и скобку в исходном SQL-запросе, разрывая его структуру.
  • OR EXTRACTVALUE(7714,CONCAT(0x7e,((SELECT (ELT(7714=7714,1)))),0x7e)) — внедряемая функция. EXTRACTVALUE — это функция MySQL для работы с XML. Она извлекает значение из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, которая включает переданные данные.
  • -- - — комментарий, который отсекает оставшуюся часть оригинального SQL-запроса, чтобы он не вызвал синтаксическую ошибку.

Внутри EXTRACTVALUE используется CONCAT(0x7e, ..., 0x7e). 0x7e — это шестнадцатеричное представление символа ~ (тильда). Он служит маркером, по которому потом легко найти выведенные данные в тексте ошибки. Вложенный запрос SELECT (ELT(7714=7714,1)) — это простейшая проверка: ELT возвращает строку по её номеру из списка. Здесь 7714=7714 — всегда истина, поэтому ELT вернёт 1 (первый элемент). В реальной атаке вместо этого подставляется подзапрос, извлекающий нужные данные (например, версию БД, имя пользователя, хеши паролей).

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

Почему EXTRACTVALUE опасен?

Функция EXTRACTVALUE в MySQL (до версии 8.0.17) при некорректном XPath-выражении возвращает ошибку вида:

XPATH syntax error: '~1~'

Злоумышленник может подставить в XPath результат подзапроса, и сервер вернёт его в тексте ошибки. Это позволяет посимвольно извлекать данные из базы. Такой метод называется error-based SQL injection.

Аналогично используются функции UPDATEXML, GTID_SUBSET и другие. Все они позволяют вызвать ошибку, содержащую контролируемые данные.

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

Основной способ защиты — параметризованные запросы (prepared statements). Они разделяют код SQL и данные, поэтому пользовательский ввод никогда не интерпретируется как часть запроса.

Дополнительные меры:

  • Использовать ORM (например, Hibernate, SQLAlchemy) с правильной настройкой.
  • Экранировать специальные символы, если параметризация невозможна (но это менее надёжно).
  • Ограничить права пользователя базы данных: не давать ему доступ к системным таблицам и функциям, если они не нужны.
  • Обновить MySQL до версии 8.0.17 или выше — в ней EXTRACTVALUE и UPDATEXML удалены.
  • Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.

Также важно регулярно проводить аудит кода и сканирование уязвимостей.

Что означает число 7714?

Число 7714 в данном примере — это произвольный идентификатор, который может меняться в разных вариантах инъекции (например, 7294, 7974). Он не несёт смысловой нагрузки, кроме как быть частью условия 7714=7714 (всегда истинного). В реальных атаках вместо этого числа могут быть другие проверки или подзапросы.

Вывод

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

Источники