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

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

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

Разбор по компонентам

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

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

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

Механизм прост: злоумышленник внедряет в уязвимый параметр выражение, которое вызывает ошибку СУБД, но в тексте ошибки содержится результат выполнения подзапроса. Например, если вместо ELT(6602=6602,1) подставить SELECT user(), то при ошибке MySQL вернёт что-то вроде:

XPATH syntax error: '~root@localhost~'

Таким образом, атакующий может последовательно извлекать имена баз данных, таблиц, столбцов и даже хеши паролей. Функция EXTRACTVALUE — не единственная; часто используются UPDATEXML, GEOMETRYCOLLECTION и другие функции, генерирующие ошибки с полезной нагрузкой.

Зачем нужна такая конструкция?

Подобные строки — это не случайный набор символов, а рабочий инструмент пентестеров и злоумышленников. Они позволяют:

  1. Проверить наличие уязвимости SQL-инъекции (если ошибка появилась — приложение уязвимо).
  2. Извлечь данные, когда другие методы (UNION, blind) недоступны или неудобны.
  3. Обойти фильтры, которые блокируют кавычки или ключевые слова, используя шестнадцатеричные литералы и нестандартные функции.

Важно понимать, что использование таких конструкций без разрешения владельца системы является нарушением закона и может преследоваться по статье 272 УК РФ (неправомерный доступ к компьютерной информации).

Как защититься от error-based SQL-инъекций

Основная рекомендация — использовать параметризованные запросы (prepared statements) и хранимые процедуры. Это предотвращает внедрение произвольного SQL-кода. Дополнительно:

  • Отключите вывод подробных сообщений об ошибках СУБД в production-среде.
  • Используйте ORM или query builder с экранированием.
  • Регулярно проводите аудит кода и сканирование уязвимостей.
  • Настройте WAF (Web Application Firewall) для блокировки подозрительных конструкций.

Строка, рассмотренная в статье, — типичный пример атаки, и её появление в логах должно стать сигналом для немедленной проверки безопасности приложения.

Источники