Запрос %' 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-инъекции, необходимо применять комплексный подход:

  1. Параметризованные запросы (prepared statements). Это самый надёжный способ: данные передаются отдельно от SQL-кода и не могут изменить его структуру.
  2. Валидация и фильтрация ввода. Проверяйте типы данных, длины, допустимые символы. Не доверяйте пользовательскому вводу.
  3. Экранирование специальных символов. Если параметризация невозможна, используйте функции экранирования, предоставляемые драйвером БД.
  4. Отключение вывода ошибок БД в продакшене. Подробные сообщения об ошибках должны писаться в лог, а пользователь видит только общую страницу ошибки.
  5. Принцип наименьших привилегий. Учётная запись, от имени которой работает приложение, должна иметь только необходимые права.
  6. Регулярное обновление СУБД и фреймворков. Уязвимости в старых версиях могут упростить эксплуатацию.
  7. Использование WAF. Веб-application firewall может блокировать известные шаблоны атак, но не заменяет исправление кода.

Заключение

Запрос с EXTRACTVALUE — это не просто набор символов, а реальный инструмент атакующего. Понимание его работы помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Помните: безопасность — это процесс, а не разовое действие. Используйте параметризованные запросы, скрывайте ошибки и следите за обновлениями.

Источники