Что такое 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. Понимание того, как работают такие конструкции, необходимо как специалистам по безопасности, так и разработчикам, чтобы своевременно находить и устранять уязвимости. Помните: лучшая защита — это параметризованные запросы и внимательное отношение к пользовательскому вводу.

Источники