В запросе пользователя фигурирует конструкция EXTRACTVALUE(9133,CONCAT(0x7e,((SELECT (ELT(9133=9133,1)))),0x7e)) — это классический пример error-based SQL-инъекции через функцию ExtractValue в MySQL. Если вы встретили такой фрагмент в логах, коде или отчёте сканера уязвимостей, эта статья объяснит, что именно происходит и как от этого защититься.
Что такое ExtractValue в MySQL
ExtractValue — это встроенная функция MySQL, предназначенная для извлечения значения из фрагмента XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_frag, XPath_expr). Она появилась в MySQL 5.1 как часть поддержки XML и часто используется в приложениях, которые хранят данные в XML-формате.
Ключевая особенность: если XPath-выражение некорректно, MySQL возвращает сообщение об ошибке, в котором отображается проблемный фрагмент. Именно это свойство и эксплуатируют злоумышленники.
Как работает error-based инъекция через ExtractValue
Механизм атаки основан на том, что СУБД включает в текст ошибки ту часть XPath-выражения, которая вызвала сбой. Злоумышленник конструирует запрос так, чтобы в это сообщение попали данные из базы.
Рассмотрим разбор запроса из примера:
EXTRACTVALUE(9133, ...)— первый аргумент (9133) не является корректным XML, что уже провоцирует ошибку.CONCAT(0x7e, (SELECT ...), 0x7e)— конкатенация символа~(0x7e) с результатом подзапроса и снова с~. Тильда используется как маркер-разделитель, чтобы в выводе легко найти извлечённые данные.SELECT (ELT(9133=9133,1))— подзапрос, возвращающий число 1. В реальной атаке вместо этого подставляется запрос к INFORMATION_SCHEMA или пользовательским таблицам.-- -— комментарий, обрезающий остаток исходного SQL-запроса.
В результате MySQL формирует ошибку вида: XPATH syntax error: '~1~'. Данные, попавшие между тильдами, — это результат выполнения внедрённого подзапроса.
Пример реального извлечения данных
Чтобы получить имя текущей базы, злоумышленник подставляет:
AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -
В ответе сервера появится сообщение об ошибке, содержащее имя базы. Аналогично извлекаются версии СУБД, имена таблиц, колонок и сами данные.
Почему это опасно
Error-based инъекции через ExtractValue (и аналогичную функцию UpdateXML) позволяют атакующему:
- Получить структуру базы данных через INFORMATION_SCHEMA.
- Извлечь логины, пароли, персональные данные пользователей.
- Обойти аутентификацию, подменив условия в запросе.
- В некоторых конфигурациях — выполнить команды на сервере.
Особенность метода в том, что он работает даже при отсутствии прямого вывода данных на странице — информация «утекает» через текст ошибки.
Как защититься от инъекций через ExtractValue
1. Используйте подготовленные выражения (prepared statements)
Это самый надёжный способ. Параметризованные запросы отделяют код SQL от данных, поэтому внедрённая строка не интерпретируется как часть запроса.
2. Экранируйте пользовательский ввод
Если по каким-то причинам prepared statements недоступны, применяйте строгое экранирование специальных символов. В PHP для этого есть mysqli_real_escape_string, в других языках — аналоги.
3. Ограничьте права пользователя БД
Учётная запись приложения не должна иметь прав на чтение INFORMATION_SCHEMA без необходимости, а также прав администратора. Принцип наименьших привилегий существенно снижает ущерб.
4. Отключите вывод подробных ошибок
В production-окружении сообщения об ошибках СУБД не должны показываться пользователю. Это лишает атакующего главного канала утечки данных.
5. Используйте WAF и мониторинг
Веб-application firewall способен распознавать характерные паттерны вроде EXTRACTVALUE, UPDATEXML, CONCAT(0x7e в параметрах запроса и блокировать их. Логи сервера стоит регулярно анализировать на предмет подобных конструкций.
Итог
Конструкция EXTRACTVALUE(9133,CONCAT(0x7e,((SELECT (ELT(9133=9133,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка эксплуатации error-based SQL-инъекции в MySQL. Понимание механики таких атак помогает разработчикам и администраторам своевременно закрывать уязвимости: использовать параметризованные запросы, ограничивать права СУБД, скрывать детали ошибок и внедрять защитные механизмы на уровне приложения и сети.
Комментарии
—Войдите, чтобы оставить комментарий