Что это за строка?
Строка ")))) 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-инъекций
Основные меры защиты:
- Параметризованные запросы (prepared statements) — самый надёжный способ. Данные передаются отдельно от SQL-кода и не интерпретируются как команды.
- Экранирование специальных символов — если параметризация невозможна, используйте функции экранирования (например,
mysqli_real_escape_string). - Отключение вывода ошибок БД — не показывайте пользователю детали ошибок. Логируйте их на сервере.
- Принцип наименьших привилегий — учётная запись БД для веб-приложения не должна иметь прав на чтение системных таблиц и выполнение опасных функций.
- 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'ов помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения. Главный вывод: используйте параметризованные запросы и не выводите ошибки БД пользователю.
Комментарии
—Войдите, чтобы оставить комментарий