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

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

Подобные payload'ы часто встречаются в отчётах об уязвимостях, при пентестах и в логах веб-серверов. Понимание того, как они работают, необходимо как специалистам по безопасности, так и разработчикам, чтобы своевременно закрывать дыры.

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

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

В нашем примере:

  • EXTRACTVALUE(8074, CONCAT(0x7e, (SELECT ...), 0x7e)) — первый аргумент (8074) — это XML-документ (произвольное число, которое не является валидным XML), второй аргумент — XPath-выражение. Если XPath-выражение некорректно, MySQL выдаёт ошибку вида XPATH syntax error: '~...~', где ... — это результат вычисления вложенного подзапроса.
  • 0x7e — это шестнадцатеричное представление символа ~ (тильда). Он используется как разделитель, чтобы в сообщении об ошибке было легко выделить полезную нагрузку.
  • ELT(8074=8074,1) — функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае условие 8074=8074 всегда истинно (возвращает 1), поэтому ELT(1,1) вернёт строку '1'. Это простейший тестовый пример, который проверяет, что инъекция работает: в ошибке появится '~1~'.
  • -- - — это комментарий, который отсекает оставшуюся часть оригинального SQL-запроса, чтобы синтаксис оставался корректным.

Таким образом, при выполнении уязвимого запроса в ответе сервера (или в логах) появится сообщение об ошибке, содержащее '~1~'. Злоумышленник может заменить ELT(8074=8074,1) на любой другой подзапрос, например, (SELECT version()), чтобы получить версию СУБД, или (SELECT password FROM users LIMIT 1), чтобы украсть хеш пароля.

Зачем нужны 0x7e и ELT?

Символ 0x7e (тильда) выбран не случайно: он редко встречается в обычных данных и позволяет легко найти границы извлечённой строки в сообщении об ошибке. Без разделителя, если подзапрос вернёт пустую строку или строку с пробелами, её будет сложно идентифицировать.

Функция ELT здесь используется как простой способ вернуть заранее известное значение (1), чтобы протестировать наличие уязвимости. В реальных атаках вместо неё подставляют вызовы других функций, например CONCAT, GROUP_CONCAT или подзапросы SELECT.

Пример эксплуатации

Предположим, на сайте есть страница product.php?id=1, и параметр id подставляется в SQL-запрос без экранирования. Атакующий может отправить:

product.php?id=1%27 AND EXTRACTVALUE(8074,CONCAT(0x7e,(SELECT database()),0x7e))-- -

В ответе сервера появится ошибка:

XPATH syntax error: '~mydatabase~'

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

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

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

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

Важно понимать, что error-based инъекция — лишь один из многих типов атак. Полноценная защита требует комплексного подхода: безопасная разработка, аудит кода, пентесты и мониторинг.

Заключение

Строка с EXTRACTVALUE — это не случайный набор символов, а тщательно сконструированный эксплойт, использующий особенности MySQL для извлечения данных через сообщения об ошибках. Знание таких техник помогает специалистам по безопасности выявлять уязвимости, а разработчикам — писать защищённый код. Если вы обнаружили подобные строки в логах своего сайта, это серьёзный повод провести аудит безопасности и проверить, не осталось ли в коде мест, где пользовательские данные попадают в SQL-запросы без обработки.

Источники