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

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

Внешне конструкция выглядит как бессмысленный набор символов, но за ней стоит продуманный механизм, использующий встроенные функции MySQL: EXTRACTVALUE, CONCAT, ELT и логическое выражение 4188=4188.

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

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

В MySQL есть несколько функций, которые при некорректных аргументах генерируют ошибку с текстом, содержащим переданные значения. Одна из них — EXTRACTVALUE(XML_document, XPath_expression). Она извлекает значение из XML по XPath-выражению. Если XPath-выражение синтаксически неверно, MySQL выдаёт ошибку вида: XPATH syntax error: '...', где в кавычках подставляется переданная строка.

Роль функции EXTRACTVALUE

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

Функция CONCAT и разделители

CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — это шестнадцатеричный код символа ~ (тильда). Тильды служат маркерами, чтобы в сообщении об ошибке легко было найти начало и конец выводимых данных.

Функция ELT и логическое выражение

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В нашем случае ELT(4188=4188,1) — логическое выражение 4188=4188 всегда истинно (1), поэтому ELT(1,1) вернёт строку '1'. Это простейший пример: в реальной атаке вместо 1 подставляется подзапрос, извлекающий данные, например (SELECT version()) или (SELECT password FROM users LIMIT 1).

Оператор OR и комментарий

Конструкция начинается с " OR .... Кавычка закрывает предполагаемую строку в оригинальном запросе, а OR добавляет условие, которое всегда истинно или вызывает ошибку. В конце -- - — это комментарий, который «съедает» остаток оригинального SQL-запроса, чтобы он не вызвал синтаксическую ошибку.

Пошаговый разбор полезной нагрузки

  1. Закрытие кавычки: " — завершает строковый литерал в уязвимом запросе.
  2. Логический оператор: OR — добавляет новое условие.
  3. Вызов EXTRACTVALUE: EXTRACTVALUE(4188, CONCAT(...)) — генерирует ошибку с текстом, содержащим результат вложенного запроса.
  4. Формирование вывода: CONCAT(0x7e, ((SELECT (ELT(4188=4188,1)))), 0x7e) — оборачивает данные тильдами.
  5. Комментарий: -- - — игнорирует оставшуюся часть запроса.

В результате в логах или на странице ошибки появится сообщение вроде: XPATH syntax error: '~1~'. Злоумышленник, заменяя 1 на подзапрос, может извлекать имена таблиц, колонок, хеши паролей и другую чувствительную информацию.

Чем опасна такая инъекция?

Error-based SQL-инъекция позволяет атакующему:

  • получить версию СУБД и имена баз данных;
  • извлечь структуру таблиц и колонок;
  • прочитать содержимое таблиц, включая учётные данные пользователей;
  • в некоторых случаях — выполнить произвольные команды на сервере.

Опасность усугубляется тем, что для эксплуатации не требуется видимый вывод данных на странице — достаточно, чтобы ошибки отображались или логировались.

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

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

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

  • экранирование специальных символов с помощью mysqli_real_escape_string или аналогичных функций;
  • валидация и фильтрация входных данных на стороне сервера;
  • ограничение прав пользователя базы данных (принцип наименьших привилегий);
  • отключение вывода подробных ошибок в production-окружении;
  • использование WAF (Web Application Firewall) для блокировки подозрительных запросов;
  • регулярное обновление СУБД и фреймворков.

Важно понимать, что EXTRACTVALUE — не единственная функция, используемая в error-based атаках. Аналогично применяются UPDATEXML, GTID_SUBSET, JSON_KEYS и другие. Поэтому защита должна быть комплексной.

Заключение

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

Источники