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

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

Разбор структуры инъекции

Рассмотрим каждый элемент подробнее:

  • %" — начало строки. Символ % часто используется в SQL-шаблонах (например, в LIKE), а кавычка " предназначена для разрыва строкового литерала в оригинальном запросе. В зависимости от контекста может применяться одинарная кавычка, но здесь показан вариант с двойной.
  • AND EXTRACTVALUE(...) — логический оператор AND с вызовом функции EXTRACTVALUE. Эта функция извлекает значение из XML-фрагмента. Если переданный XML некорректен, MySQL генерирует ошибку, содержащую переданные данные.
  • 3107 — произвольное число, первый аргумент EXTRACTVALUE. Обычно это идентификатор, который не влияет на суть атаки, но должен быть допустимым.
  • CONCAT(0x7e, ((SELECT (ELT(3107=3107,1)))), 0x7e) — конкатенация строк. 0x7e — шестнадцатеричное представление символа ~ (тильда), используется как разделитель, чтобы облегчить поиск выводимых данных в сообщении об ошибке.
  • SELECT (ELT(3107=3107,1)) — подзапрос, возвращающий результат функции ELT. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 3107=3107 — всегда истинное условие (1), поэтому ELT(1,1) вернёт 1. В реальной атаке вместо 1 подставляется SQL-запрос, извлекающий нужные данные (например, имя пользователя, хеш пароля).
  • -- - — комментарий, который отсекает оставшуюся часть оригинального запроса, чтобы не возникло синтаксических ошибок.

Принцип работы error-based инъекции

MySQL-функция EXTRACTVALUE(XML_document, XPath_expression) анализирует первый аргумент как XML. Если XML содержит недопустимые символы (например, тильду в начале), СУБД выдаёт ошибку вида:

XPATH syntax error: '~1~'

В этом сообщении отображается переданная строка, включая результат подзапроса. Таким образом, атакующий может заставить сервер вернуть содержимое базы данных в тексте ошибки, которое затем отображается на странице (если включён вывод ошибок) или сохраняется в логах.

В приведённой строке подзапрос SELECT (ELT(3107=3107,1)) возвращает 1, поэтому ошибка будет содержать ~1~. В реальной атаке вместо 1 подставляется, например, (SELECT version()) или (SELECT password FROM users LIMIT 1), и в ошибке появятся эти данные.

Цели и опасность

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

Подобные строки часто встречаются в отчётах сканеров уязвимостей (например, SQLMap) и в логах веб-серверов при попытках взлома.

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

Для предотвращения SQL-инъекций необходимо:

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

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

Заключение

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

Источники