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

Строка вида %")) OR EXTRACTVALUE(3876,CONCAT(0x7e,((SELECT (ELT(3876=3876,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.

EXTRACTVALUE — это встроенная функция MySQL, предназначенная для работы с XML. Она извлекает значение из XML-документа по заданному XPath-выражению. Однако при неправильном использовании она может генерировать ошибки, содержащие переданные в неё данные. Этим и пользуются злоумышленники.

Как работает error-based SQL-инъекция?

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

В приведённой строке используется функция EXTRACTVALUE с двумя аргументами: первый — произвольное число (3876), второй — результат CONCAT, который объединяет тильды (0x7e) с подзапросом. Подзапрос SELECT (ELT(3876=3876,1)) возвращает 1, так как условие истинно. Однако на практике вместо этого подзапроса внедряется запрос к системным таблицам, например, для получения имени базы данных или хешей паролей.

Когда EXTRACTVALUE получает некорректный XPath (в данном случае строка с тильдами не является валидным XPath), MySQL генерирует ошибку вида: XPATH syntax error: '~результат_подзапроса~'. Эта ошибка возвращается в ответе сервера, и атакующий может прочитать извлечённые данные.

Разбор строки

  • %")) — часть, которая закрывает предыдущие кавычки и скобки в уязвимом запросе, подготавливая почву для внедрения.
  • OR EXTRACTVALUE(3876,CONCAT(0x7e,((SELECT ...)),0x7e)) — внедряемая конструкция. Если исходный запрос был ложным, OR заставляет его выполниться.
  • -- - — комментарий, который отсекает оставшуюся часть оригинального SQL-запроса.

Зачем используется EXTRACTVALUE?

Функция EXTRACTVALUE удобна для атакующих по нескольким причинам:

  • Она доступна в MySQL версий до 5.7 (в более новых версиях она удалена).
  • При передаче невалидного XPath она возвращает ошибку, содержащую переданную строку.
  • Позволяет извлекать данные посимвольно или целыми строками, в зависимости от подзапроса.

Аналогично используется функция UPDATEXML. Обе они относятся к классу функций, генерирующих ошибки с полезной нагрузкой.

Пример эксплуатации

Предположим, есть уязвимый параметр id в URL: http://example.com/product.php?id=1. Запрос в коде может выглядеть так:

SELECT * FROM products WHERE id = '1'

Атакующий подставляет:

1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -

В результате MySQL вернёт ошибку: XPATH syntax error: '~имя_базы~'. Так злоумышленник узнаёт имя текущей базы данных.

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

Основные меры защиты:

  1. Использование подготовленных выражений (prepared statements). Это самый надёжный способ, при котором данные не смешиваются с SQL-кодом.
  2. Экранирование специальных символов. Если подготовленные выражения недоступны, следует тщательно экранировать все пользовательские вводы.
  3. Отключение вывода ошибок БД на продакшене. Ошибки не должны показываться пользователю, чтобы не раскрывать структуру БД.
  4. Регулярное обновление СУБД. В MySQL 5.7+ функции EXTRACTVALUE и UPDATEXML удалены, что снижает риск.
  5. Использование WAF (Web Application Firewall). Многие WAF блокируют известные сигнатуры SQL-инъекций.

Заключение

Строка с EXTRACTVALUE — это не случайный набор символов, а целенаправленная попытка эксплуатации уязвимости. Понимание принципов работы таких инъекций помогает разработчикам и администраторам лучше защищать свои системы. Всегда проверяйте вводимые данные и используйте современные методы защиты.

Источники