Что это за строка?
Строка %')))) AND EXTRACTVALUE(1592,CONCAT(0x7e,((SELECT (ELT(1592=1592,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке, содержащего результат внедрённого запроса. Подобные строки часто встречаются в логах веб-серверов, когда злоумышленники пытаются проэксплуатировать уязвимость на сайте.
Как работает эта инъекция?
Основная идея error-based SQL-инъекции заключается в том, чтобы заставить базу данных вернуть данные в тексте ошибки. В MySQL для этого часто используют функцию EXTRACTVALUE(), которая извлекает значение из XML-строки по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, включающую переданный аргумент. Это позволяет атакующему «вытащить» содержимое базы.
Разберём строку по частям:
%'))))— часть, которая, вероятно, закрывает предыдущие кавычки и скобки в уязвимом SQL-запросе, чтобы внедрить свой код.AND EXTRACTVALUE(1592,CONCAT(0x7e,((SELECT (ELT(1592=1592,1)))),0x7e))— собственно инъекция. ФункцияEXTRACTVALUEполучает два аргумента: число 1592 (может быть любым) и строку, сформированнуюCONCAT. ВнутриCONCATиспользуется0x7e(тильда ~) в качестве разделителя и подзапросSELECT (ELT(1592=1592,1)).ELT()возвращает N-й элемент из списка; здесь1592=1592всегда истинно (возвращает 1), поэтомуELT(1,1)вернёт 1. Это простейшая проверка на возможность инъекции.-- -— комментарий, который отсекает оставшуюся часть оригинального запроса.
Если уязвимость существует, MySQL выполнит EXTRACTVALUE с некорректным XPath (строка не является валидным XML), и в ошибке появится сообщение вида: XPATH syntax error: '~1~'. Это подтверждает, что инъекция работает. В реальной атаке вместо ELT(1592=1592,1) подставляются запросы к системным таблицам, например, SELECT table_name FROM information_schema.tables, и их результаты попадают в текст ошибки.
Зачем используется EXTRACTVALUE?
Функция EXTRACTVALUE появилась в MySQL 5.1 и предназначена для работы с XML. Однако из-за особенности формирования сообщений об ошибках она стала популярным инструментом для error-based инъекций. Аналогично используются функции UPDATEXML и GTID_SUBSET. Все они позволяют получить данные в обход «слепых» методов, когда приложение не выводит результаты запроса напрямую.
Как защититься?
Основной способ защиты — использование параметризованных запросов (prepared statements). Никогда не подставляйте пользовательские данные в SQL-запросы напрямую. Также рекомендуется:
- Экранировать все входные данные с помощью
mysqli_real_escape_stringили аналогичных функций. - Ограничить права пользователя базы данных: не давать доступ к
information_schemaбез необходимости. - Включить логирование ошибок на сервере, но не выводить их пользователю.
- Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Примеры реальных атак
Подобные строки часто встречаются в логах при сканировании сайтов автоматическими сканерами уязвимостей (например, SQLmap). Они пытаются определить, уязвим ли параметр, и если да — извлечь данные. Владельцам сайтов следует внимательно относиться к таким записям: они могут быть предвестниками серьёзной атаки.
Вывод
Строка %')))) AND EXTRACTVALUE(1592,CONCAT(0x7e,((SELECT (ELT(1592=1592,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции, использующей особенности MySQL. Понимание таких строк помогает разработчикам и администраторам своевременно выявлять попытки взлома и укреплять защиту своих приложений.
Комментарии
—Войдите, чтобы оставить комментарий