Что такое SQL-инъекция через ExtractValue?

SQL-инъекция остаётся одной из самых опасных уязвимостей веб-приложений, входя в топ OWASP. Один из её вариантов — error-based инъекция с использованием функции EXTRACTVALUE в MySQL. Эта функция извлекает значение из XML-строки, и при передаче некорректного XPath-выражения генерирует ошибку, в тексте которой могут отобразиться данные из базы. Злоумышленники используют это для получения информации о структуре БД и её содержимом.

Рассматриваемый запрос ' OR EXTRACTVALUE(2266,CONCAT(0x7e,((SELECT (ELT(2266=2266,1)))),0x7e))-- - — классический пример такой атаки. Он пытается вызвать ошибку, которая выведет результат подзапроса. В данном случае проверяется тривиальное условие 2266=2266 (всегда истина), и функция ELT(1,1) возвращает строку '1'. Однако цель запроса — продемонстрировать технику, которая может быть использована для извлечения произвольных данных, таких как имена таблиц, колонок или пароли пользователей.

Как работает запрос?

Разберём по частям:

  • ' OR ... -- - — закрывает кавычку в исходном SQL-запросе и добавляет условие OR, чтобы обойти аутентификацию или изменить логику запроса. Двойной дефис с пробелом в конце — комментарий, отсекающий остаток оригинального запроса.
  • EXTRACTVALUE(2266, CONCAT(0x7e, (SELECT (ELT(2266=2266,1))), 0x7e)) — функция EXTRACTVALUE принимает два аргумента: XML-документ (здесь просто число 2266, что не является валидным XML) и XPath-выражение. XPath строится через CONCAT: тильда (0x7e) + результат подзапроса + тильда. Поскольку первый аргумент не является корректным XML, MySQL выдаст ошибку, в тексте которой будет указано переданное XPath-выражение, содержащее результат подзапроса.
  • SELECT (ELT(2266=2266,1)) — подзапрос, возвращающий '1' (так как условие истинно, ELT выбирает первый элемент из списка). В реальной атаке вместо этого подзапроса злоумышленник мог бы указать, например, (SELECT password FROM users LIMIT 1), и тогда ошибка содержала бы пароль.

Таким образом, запрос заставляет сервер выдать сообщение об ошибке, в котором утекает результат выполнения подзапроса. Это позволяет атакующему поэтапно извлекать данные из базы, даже если приложение не выводит их напрямую.

Примеры использования в реальных атаках

Злоумышленники часто модифицируют подобные запросы для получения конкретной информации. Например, чтобы узнать имя текущей базы данных, можно подставить (SELECT database()). Для получения списка таблиц — (SELECT table_name FROM information_schema.tables LIMIT 1). Поскольку функция EXTRACTVALUE возвращает ошибку с переданным XPath, эти данные отобразятся в сообщении об ошибке, которое может быть видно на странице или в логах.

Важно: error-based инъекции работают только если приложение выводит ошибки СУБД пользователю. В противном случае атакующий переходит к blind-инъекциям.

Другой распространённый вариант — использование функции UPDATEXML, аналогичной по принципу. Также применяются floor(), rand() и другие функции, вызывающие ошибки с полезной нагрузкой.

Как защититься от SQL-инъекций?

Основной метод — использование параметризованных запросов (prepared statements). Это гарантирует, что пользовательский ввод не интерпретируется как SQL-код. Дополнительные меры:

  • Отключить вывод подробных ошибок СУБД в производственной среде.
  • Использовать ORM или библиотеки, автоматически экранирующие данные.
  • Применять принцип наименьших привилегий для учётной записи БД: не давать прав на чтение information_schema без необходимости.
  • Регулярно проводить сканирование уязвимостей и код-ревью.
  • Использовать WAF (Web Application Firewall) для блокировки подозрительных запросов.

В случае с MySQL можно также ограничить права пользователя, запретив доступ к системным таблицам. Однако это не панацея: инъекция может эксплуатировать и другие функции.

Заключение

Запрос ' OR EXTRACTVALUE(2266,CONCAT(0x7e,((SELECT (ELT(2266=2266,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Он показывает, как через ошибки можно извлекать данные. Понимание таких техник необходимо для безопасной разработки. Всегда проверяйте входные данные и используйте современные методы защиты.

Источники