Что это за строка?
Строка " 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-запроса, чтобы он не вызвал синтаксическую ошибку.
Пошаговый разбор полезной нагрузки
- Закрытие кавычки:
"— завершает строковый литерал в уязвимом запросе. - Логический оператор:
OR— добавляет новое условие. - Вызов EXTRACTVALUE:
EXTRACTVALUE(4188, CONCAT(...))— генерирует ошибку с текстом, содержащим результат вложенного запроса. - Формирование вывода:
CONCAT(0x7e, ((SELECT (ELT(4188=4188,1)))), 0x7e)— оборачивает данные тильдами. - Комментарий:
-- -— игнорирует оставшуюся часть запроса.
В результате в логах или на странице ошибки появится сообщение вроде: 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. Понимание принципов её работы помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Главный вывод: используйте параметризованные запросы и не выводите подробные ошибки базы данных конечным пользователям.
Комментарии
—Войдите, чтобы оставить комментарий