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

Строка %')))) 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. Понимание таких строк помогает разработчикам и администраторам своевременно выявлять попытки взлома и укреплять защиту своих приложений.

Источники