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

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

В основе лежит функция EXTRACTVALUE(), которая извлекает значение из XML-документа по заданному XPath-выражению. Если XPath-выражение синтаксически некорректно, MySQL генерирует ошибку, содержащую переданный фрагмент. Злоумышленник использует это для внедрения подзапросов, результаты которых попадают в текст ошибки.

Разбор синтаксиса

Рассмотрим по частям:

  • )))) — последовательность закрывающих скобок, которая может закрывать ранее открытые скобки в уязвимом запросе, чтобы внедрить свой код.
  • AND EXTRACTVALUE(2080,CONCAT(0x7e,((SELECT (ELT(2080=2080,1)))),0x7e)) — логическое условие, которое всегда истинно (2080=2080), но при этом вызывает выполнение вложенного подзапроса.
  • -- - — комментарий, обрезающий остаток оригинального SQL-запроса.

Функция EXTRACTVALUE(2080, ...) принимает два аргумента: первый (2080) — это XML-документ (в данном случае число, которое будет преобразовано в строку), второй — XPath-выражение. Второй аргумент формируется через CONCAT(0x7e, ((SELECT (ELT(2080=2080,1)))), 0x7e). Здесь 0x7e — это шестнадцатеричное представление символа тильды (~).

Внутри CONCAT выполняется подзапрос SELECT (ELT(2080=2080,1)). Функция ELT() возвращает N-й элемент из списка. Если условие 2080=2080 истинно (что всегда так), то ELT(1,1) вернёт первый элемент — число 1. Таким образом, XPath-выражение становится ~1~, что не является корректным XPath. MySQL выдаст ошибку вида: XPATH syntax error: '~1~'. В реальной атаке вместо 1 подставляется подзапрос, извлекающий данные (например, версию БД, имена таблиц, хеши паролей).

Как работает error-based SQL-инъекция через EXTRACTVALUE

Error-based SQL-инъекция — это техника, при которой злоумышленник заставляет базу данных вернуть данные в составе сообщения об ошибке. MySQL поддерживает функции EXTRACTVALUE() и UPDATEXML(), которые при некорректном XPath генерируют ошибку с указанием проблемного фрагмента. Это позволяет извлекать произвольные данные, если они могут быть преобразованы в строку и помещены в XPath.

Пример полезной нагрузки для получения версии MySQL:

AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))

В ответе придёт ошибка: XPATH syntax error: '~5.7.33~'. Аналогично можно извлекать имена таблиц, колонок и содержимое полей.

В приведённой строке используется ELT(2080=2080,1) — это упрощённый пример, демонстрирующий механизм. Число 2080 может быть любым; важно, что условие всегда истинно, поэтому ELT возвращает 1. В реальных атаках вместо 1 подставляется подзапрос, например (SELECT table_name FROM information_schema.tables LIMIT 1).

Контекст использования

Такие строки часто встречаются в логах веб-серверов, WAF (Web Application Firewall) и систем обнаружения вторжений. Они могут быть частью автоматизированных сканеров уязвимостей (sqlmap, Havij) или ручных пентестов. Если вы видите подобную запись в логах, это означает, что кто-то пытался проэксплуатировать SQL-инъекцию на вашем сайте.

Важно понимать, что сам по себе запрос не наносит вреда, если приложение корректно обрабатывает ввод. Однако если параметр, в который внедряется строка, попадает в SQL-запрос без экранирования, база данных выполнит вредоносный код.

Меры защиты

Чтобы предотвратить error-based SQL-инъекции, необходимо:

  • Использовать подготовленные выражения (prepared statements) с параметризацией. Это самый надёжный способ, так как данные не смешиваются с кодом SQL.
  • Применять хранимые процедуры с параметрами.
  • Экранировать специальные символы с помощью функций типа mysqli_real_escape_string() (но это менее надёжно, чем подготовленные выражения).
  • Валидировать и фильтровать входные данные по белому списку.
  • Отключить вывод подробных ошибок в production-окружении. Ошибки СУБД не должны попадать в ответ клиенту.
  • Использовать WAF для блокировки подозрительных запросов.
  • Регулярно обновлять СУБД и библиотеки, чтобы закрыть известные уязвимости.

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

Заключение

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

Источники