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

SQL-инъекция — один из самых распространённых способов атаки на веб-приложения, при котором злоумышленник внедряет вредоносный SQL-код в запросы к базе данных. Одной из разновидностей является error-based SQL-инъекция, основанная на генерации ошибок СУБД, содержащих полезную информацию. Функция ExtractValue в MySQL часто используется для извлечения данных через сообщения об ошибках.

Конкретный запрос, который мы разбираем: %')) OR EXTRACTVALUE(2447,CONCAT(0x7e,((SELECT (ELT(2447=2447,1)))),0x7e))-- - — это типичная полезная нагрузка (payload) для проверки уязвимости и извлечения данных. Давайте разберём его по частям.

Синтаксис и назначение функции ExtractValue

Функция ExtractValue в MySQL предназначена для извлечения значения из XML-строки по заданному XPath-выражению. Синтаксис:

EXTRACTVALUE(xml_frag, xpath_expr)

Если XPath-выражение содержит синтаксическую ошибку, MySQL возвращает ошибку с сообщением, включающим переданный XPath. Это и используется для инъекций: злоумышленник может поместить результат подзапроса в XPath, чтобы он отобразился в тексте ошибки.

Разбор полезной нагрузки

Рассмотрим запрос детально:

  • %')) — закрытие предыдущих кавычек и скобок в исходном SQL-запросе, чтобы внедрить свой код.
  • OR EXTRACTVALUE(2447,CONCAT(0x7e,((SELECT (ELT(2447=2447,1)))),0x7e)) — вызов функции ExtractValue с двумя аргументами: первый — произвольное число 2447, второй — конкатенация тильды (0x7e), результата подзапроса и ещё одной тильды.
  • -- - — комментарий, обрезающий остаток оригинального запроса.

Внутренний подзапрос SELECT (ELT(2447=2447,1)) возвращает 1, так как условие 2447=2447 истинно. Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь список состоит из одного элемента '1', поэтому результат — строка '1'.

Далее CONCAT объединяет тильду (символ ~), результат '1' и ещё одну тильду. Получается строка ~1~. Эта строка передаётся как XPath-выражение в ExtractValue. Поскольку ~1~ не является корректным XPath, MySQL генерирует ошибку вида:

XPATH syntax error: '~1~'

Таким образом, в сообщении об ошибке отображается результат выполнения подзапроса. В реальной атаке вместо ELT(2447=2447,1) подставляются запросы к системным таблицам, например, для получения имени базы данных, таблиц или хешей паролей.

Как эксплуатируется уязвимость?

Процесс эксплуатации error-based SQL-инъекции через ExtractValue обычно включает следующие шаги:

  1. Обнаружение уязвимости: внедрение простых конструкций, вызывающих ошибку (например, добавление кавычки), и анализ ответа сервера.
  2. Определение типа СУБД: MySQL, PostgreSQL, MSSQL и т.д. Функция ExtractValue специфична для MySQL.
  3. Извлечение данных: последовательное выполнение подзапросов, возвращающих нужную информацию, с помещением её в XPath-выражение. Например, для получения имени базы данных: EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e)).
  4. Автоматизация: использование инструментов вроде sqlmap, которые автоматически подбирают полезные нагрузки и извлекают данные.

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

Меры защиты

Чтобы предотвратить SQL-инъекции, включая error-based через ExtractValue, рекомендуется:

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

Заключение

SQL-инъекция через ExtractValue — это мощный метод извлечения данных из базы MySQL, использующий ошибки XPath. Понимание механизма работы таких полезных нагрузок помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Всегда проверяйте входные данные и используйте современные методы предотвращения инъекций.

Источники