Запрос %' AND EXTRACTVALUE(6133,CONCAT(0x7e,((SELECT (ELT(6133=6133,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции в СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы через сообщения об ошибках. В этой статье мы разберём, как работает этот запрос, зачем нужна функция ExtractValue, и как защитить приложение от подобных атак.
Что такое error-based SQL-инъекция?
SQL-инъекция — один из самых распространённых способов взлома веб-приложений. Злоумышленник внедряет в пользовательский ввод специальные символы и команды, которые меняют логику SQL-запроса. Error-based (основанная на ошибках) разновидность позволяет получать данные напрямую из текста ошибки, которую возвращает база данных.
В MySQL для этого часто используют функции, работающие с XML: ExtractValue() и UpdateXML(). Они генерируют ошибки, если переданный XPath-выражение некорректно, и в тексте ошибки может отобразиться результат подзапроса.
Разбор запроса по частям
Рассмотрим каждый элемент внедрённой строки:
%'— закрывает предыдущее строковое значение в уязвимом параметре (например, вWHERE name LIKE '%...%'). Символ%— подстановочный знак в LIKE, а апостроф завершает строку.AND— логический оператор, добавляющий условие к исходному запросу.EXTRACTVALUE(6133, CONCAT(0x7e, ((SELECT (ELT(6133=6133,1)))), 0x7e))— вызов функции ExtractValue с заведомо некорректным XPath, чтобы вызвать ошибку.-- -— комментарий, обрезающий остаток оригинального запроса. Пробел после--обязателен в MySQL.
Функция ExtractValue
ExtractValue(XML_document, XPath_expression) извлекает значение из XML-строки по заданному XPath. Если XPath синтаксически неверен, MySQL возвращает ошибку вида: XPATH syntax error: '...'. В этой ошибке отображается переданное XPath-выражение. Злоумышленник конструирует XPath так, чтобы в него попали данные из подзапроса — они и «утекают» в сообщении об ошибке.
Конкатенация и разделители
CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — шестнадцатеричный код символа ~ (тильда). Тильды служат визуальными маркерами, чтобы в выводе ошибки легко было найти границы извлечённых данных.
Подзапрос с ELT
SELECT (ELT(6133=6133,1)) — это подзапрос, который возвращает 1, если условие 6133=6133 истинно. Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь она использована для демонстрации: в реальной атаке вместо 1 подставляют имена таблиц, колонок или другие данные, полученные из информационной схемы MySQL.
Число 6133 в первом аргументе ExtractValue — произвольное, оно не влияет на логику, но может быть использовано для уникальной идентификации запроса в логах.
Как это работает на практике
Предположим, уязвимый запрос выглядит так:
SELECT * FROM users WHERE name LIKE '%$input%';
Если пользователь передаст строку %' AND EXTRACTVALUE(6133,CONCAT(0x7e,((SELECT (ELT(6133=6133,1)))),0x7e))-- -, итоговый запрос станет:
SELECT * FROM users WHERE name LIKE '%%' AND EXTRACTVALUE(6133,CONCAT(0x7e,((SELECT (ELT(6133=6133,1)))),0x7e))-- -%';
MySQL выполнит ExtractValue, возникнет ошибка, и в ответе сервера появится что-то вроде:
XPATH syntax error: '~1~'
Таким образом, атакующий узнаёт, что подзапрос вернул 1. Меняя подзапрос, можно извлекать имена баз данных, таблиц, колонок и даже хэши паролей — посимвольно или целыми строками, если позволяет длина сообщения об ошибке.
Цели злоумышленника
- Получение структуры базы данных (имена таблиц и колонок).
- Извлечение конфиденциальных данных: логинов, паролей, персональной информации.
- Обход аутентификации или повышение привилегий.
- В некоторых случаях — выполнение произвольных команд на сервере (при наличии соответствующих прав).
Меры защиты
Чтобы предотвратить error-based SQL-инъекции, необходимо применять комплексный подход:
- Параметризованные запросы (prepared statements). Это самый надёжный способ: данные передаются отдельно от SQL-кода и не могут изменить его структуру.
- Валидация и фильтрация ввода. Проверяйте типы данных, длины, допустимые символы. Не доверяйте пользовательскому вводу.
- Экранирование специальных символов. Если параметризация невозможна, используйте функции экранирования, предоставляемые драйвером БД.
- Отключение вывода ошибок БД в продакшене. Подробные сообщения об ошибках должны писаться в лог, а пользователь видит только общую страницу ошибки.
- Принцип наименьших привилегий. Учётная запись, от имени которой работает приложение, должна иметь только необходимые права.
- Регулярное обновление СУБД и фреймворков. Уязвимости в старых версиях могут упростить эксплуатацию.
- Использование WAF. Веб-application firewall может блокировать известные шаблоны атак, но не заменяет исправление кода.
Заключение
Запрос с EXTRACTVALUE — это не просто набор символов, а реальный инструмент атакующего. Понимание его работы помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Помните: безопасность — это процесс, а не разовое действие. Используйте параметризованные запросы, скрывайте ошибки и следите за обновлениями.
Комментарии
—Войдите, чтобы оставить комментарий