Что это за строка?

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

Подобные payload'ы часто встречаются в отчётах сканеров уязвимостей (например, sqlmap) и в практических заданиях по пентесту (DVWA, SQLZoo). Их цель — заставить базу данных выдать содержимое таблиц в тексте ошибки, которое затем отображается на веб-странице.

Как работает EXTRACTVALUE в SQL-инъекции

Функция EXTRACTVALUE(XML_fragment, XPath_expression) в MySQL предназначена для извлечения значения из XML-документа по XPath-выражению. Однако при передаче некорректного XPath-выражения она генерирует ошибку XPATH syntax error, в тексте которой выводится переданный фрагмент.

Злоумышленник использует это свойство: он подставляет в XPath-выражение результат подзапроса SELECT, и MySQL возвращает его в сообщении об ошибке. Например:

XPATH syntax error: '~1~'

В нашем payload'e:

  • 2339 — произвольное число (идентификатор), передаваемое как XML-фрагмент. Оно не играет роли, важен второй аргумент.
  • CONCAT(0x7e, ..., 0x7e) — объединяет символ ~ (0x7e) с результатом подзапроса, чтобы отделить его в сообщении об ошибке.
  • SELECT (ELT(2339=2339,1)) — подзапрос, возвращающий значение. Здесь ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Условие 2339=2339 всегда истинно (1), поэтому ELT(1,1) вернёт 1. В реальной атаке вместо этого подзапроса подставляют извлечение имён таблиц, колонок или данных.
  • -- - — комментарий, который отсекает оставшуюся часть оригинального SQL-запроса.

В результате база данных возвращает ошибку вида: XPATH syntax error: '~1~', и атакующий видит результат выполнения подзапроса.

Зачем нужен error-based подход

Error-based SQL-инъекция применяется, когда:

  • Приложение не выводит данные напрямую (нет UNION-инъекции).
  • Включён вывод ошибок БД на страницу (частая ошибка конфигурации).
  • Нужно быстро извлечь информацию посимвольно или целыми строками.

Это один из самых эффективных методов для MySQL, наряду с UPDATEXML, GTID_SUBSET и EXP.

Пример реальной эксплуатации

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

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

Если приложение уязвимо, в ответе появится ошибка с именем текущей базы данных. Далее можно извлекать таблицы, колонки и записи, используя GROUP_CONCAT и LIMIT.

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

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

  1. Параметризованные запросы (prepared statements) — самый надёжный способ. Данные передаются отдельно от SQL-кода и не интерпретируются как команды.
  2. Экранирование специальных символов — если параметризация невозможна, используйте функции экранирования (например, mysqli_real_escape_string).
  3. Отключение вывода ошибок БД — не показывайте пользователю детали ошибок. Логируйте их на сервере.
  4. Принцип наименьших привилегий — учётная запись БД для веб-приложения не должна иметь прав на чтение системных таблиц и выполнение опасных функций.
  5. WAF (Web Application Firewall) — может блокировать известные сигнатуры, но не является панацеей.

Частые вопросы

Почему используется именно 0x7e?

Символ ~ (тильда) редко встречается в обычных данных и хорошо заметен в сообщении об ошибке. Он служит маркером начала и конца извлекаемого значения.

Что такое ELT в этом payload?

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В примере ELT(2339=2339,1) всегда возвращает 1, так как условие истинно. Это упрощённый пример для демонстрации; в реальных атаках вместо 1 подставляют подзапросы.

Работает ли это на других СУБД?

Нет, EXTRACTVALUE — специфичная функция MySQL. Для PostgreSQL, MSSQL или Oracle используются другие техники error-based инъекций (например, CAST, convert).

Заключение

Строка с EXTRACTVALUE — это не случайный набор символов, а тщательно сконструированный эксплойт для извлечения данных из MySQL через ошибки. Понимание таких payload'ов помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения. Главный вывод: используйте параметризованные запросы и не выводите ошибки БД пользователю.

Источники