Что такое SQL-инъекция с EXTRACTVALUE?
SQL-инъекция (SQL Injection) — один из самых распространённых и опасных видов атак на веб-приложения. Она входит в топ OWASP уже много лет. Строка, которую вы видите:
'))) AND EXTRACTVALUE(1792,CONCAT(0x7e,((SELECT (ELT(1792=1792,1)))),0x7e))-- -
— это классический пример error-based SQL-инъекции для СУБД MySQL. Такие конструкции позволяют злоумышленнику извлекать данные из базы, используя сообщения об ошибках, которые возвращает сервер.
Как работает этот запрос?
Разберём по частям.
')))— закрывает предыдущие скобки и кавычку в уязвимом SQL-запросе, чтобы внедрить свой код.AND EXTRACTVALUE(1792, ...)— вызывает функциюEXTRACTVALUE(), которая предназначена для извлечения значений из XML. Она принимает два аргумента: XML-документ и XPath-выражение. Если XPath-выражение некорректно, MySQL выдаёт ошибку с фрагментом переданного выражения.CONCAT(0x7e, ((SELECT (ELT(1792=1792,1)))), 0x7e)— формирует строку, которая будет использована как XPath.0x7e— это тильда (~), используется как маркер начала и конца выводимых данных.ELT(1792=1792,1)— функцияELT()возвращает N-й элемент из списка. Здесь условие1792=1792всегда истинно (1), поэтомуELT(1,1)вернёт1.-- -— комментарий, который обрезает оставшуюся часть оригинального запроса.
В результате MySQL попытается выполнить XPath-выражение, начинающееся с тильды, что вызовет ошибку вида: XPATH syntax error: '~1~'. В сообщении об ошибке злоумышленник увидит данные, которые были подставлены в XPath — в данном случае 1. Меняя условие и подзапросы, можно извлекать имена таблиц, колонок, пароли и другую конфиденциальную информацию.
Зачем это нужно злоумышленнику?
Error-based инъекции — мощный инструмент, потому что они позволяют получать данные напрямую из сообщений об ошибках, без необходимости использовать слепые методы (blind SQLi), которые требуют множества запросов и времени. Функция EXTRACTVALUE (а также UPDATEXML) часто используется именно для этих целей.
Пример из реальной практики: если в приложении есть уязвимый параметр, злоумышленник может подставить конструкцию, подобную приведённой, и в ответе сервера увидеть результат выполнения подзапроса. Например, заменив ELT(1792=1792,1) на (SELECT version()), можно узнать версию MySQL. А заменив на (SELECT password FROM users LIMIT 1) — получить хеш пароля администратора.
Пример работы
Рассмотрим упрощённый пример. Пусть есть запрос:
SELECT * FROM articles WHERE id = 1;
Злоумышленник передаёт в параметр id значение:
1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))
Если приложение уязвимо, MySQL выполнит это и вернёт ошибку:
XPATH syntax error: '~имя_базы~'
Таким образом, имя текущей базы данных окажется в сообщении об ошибке, которое увидит атакующий.
Как защититься от таких атак?
Основной метод защиты — использование параметризованных запросов (prepared statements). Они разделяют код SQL и данные, поэтому внедрение произвольного SQL-кода становится невозможным. Дополнительные меры:
- Экранирование специальных символов (но это менее надёжно, чем параметризация).
- Ограничение прав пользователя базы данных: приложение должно работать с минимально необходимыми привилегиями.
- Отключение вывода подробных сообщений об ошибках в production-окружении.
- Использование WAF (Web Application Firewall) для фильтрации подозрительных запросов.
- Регулярное обновление СУБД и фреймворков.
Важно понимать, что EXTRACTVALUE — не единственная функция, эксплуатируемая в error-based инъекциях. UPDATEXML, GTID_SUBSET, JSON_KEYS и другие также могут использоваться. Поэтому защита должна быть комплексной.
Заключение
Строка '))) AND EXTRACTVALUE(1792,CONCAT(0x7e,((SELECT (ELT(1792=1792,1)))),0x7e))-- - — это типичный пример попытки эксплуатации error-based SQL-инъекции в MySQL. Понимание того, как работают такие конструкции, необходимо как специалистам по безопасности, так и разработчикам, чтобы своевременно находить и устранять уязвимости. Помните: лучшая защита — это параметризованные запросы и внимательное отношение к пользовательскому вводу.
Комментарии
—Войдите, чтобы оставить комментарий