Что такое SQL-инъекция через EXTRACTVALUE?

SQL-инъекция — один из самых распространённых способов атаки на веб-приложения, при котором злоумышленник внедряет вредоносный SQL-код в запросы к базе данных. Error-based SQL-инъекция — это техника, при которой атакующий заставляет СУБД выдать сообщение об ошибке, содержащее извлекаемые данные. Функция EXTRACTVALUE в MySQL часто используется именно для этого.

Рассматриваемый запрос: %")))) AND EXTRACTVALUE(2560,CONCAT(0x7e,((SELECT (ELT(2560=2560,1)))),0x7e))-- - — типичный пример error-based инъекции. Давайте разберём его по частям.

Синтаксис и назначение EXTRACTVALUE

Функция EXTRACTVALUE предназначена для извлечения значения из XML-документа по заданному XPath-выражению. Она принимает два аргумента: XML-строку и XPath-выражение. Если XPath возвращает не текстовый узел, а, например, несколько узлов или недопустимый символ, MySQL генерирует ошибку с указанием проблемного фрагмента. Именно эту особенность эксплуатируют злоумышленники.

В легитимном коде EXTRACTVALUE используется редко, но в контексте атак она стала классическим инструментом для извлечения данных через ошибки.

Разбор вредоносного запроса

Строка %")))) AND EXTRACTVALUE(2560,CONCAT(0x7e,((SELECT (ELT(2560=2560,1)))),0x7e))-- - состоит из нескольких частей:

  • %")))) — попытка закрыть предыдущие кавычки и скобки, чтобы внедрить свой код в существующий SQL-запрос.
  • AND EXTRACTVALUE(...) — добавляет условие, которое всегда истинно (AND с функцией), но при этом вызывает ошибку.
  • 2560 — произвольное число, первый аргумент EXTRACTVALUE (XML-документ). Поскольку это не XML, функция сразу попытается его обработать.
  • CONCAT(0x7e, ((SELECT (ELT(2560=2560,1)))), 0x7e) — конкатенация тильды (0x7e — символ ~), результата подзапроса и ещё одной тильды. ELT(2560=2560,1) возвращает 1, так как условие истинно. Подзапрос может быть заменён на любой другой, например, для извлечения имени пользователя или пароля.
  • -- - — комментарий, обрезающий остаток оригинального запроса.

В результате MySQL попытается выполнить EXTRACTVALUE с не-XML аргументом и выдаст ошибку вида: XPATH syntax error: '~1~'. В реальной атаке вместо 1 подставляется результат подзапроса, например, версия СУБД, имя базы данных или хеш пароля.

Как работает ELT и CONCAT в этом запросе

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(2560=2560,1) вернёт 1, потому что условие 2560=2560 истинно (равно 1). Это простейший пример, но вместо 1 может быть любой подзапрос, например: (SELECT password FROM users LIMIT 1).

CONCAT объединяет символ ~ (0x7e), результат подзапроса и ещё один ~. Тильды нужны, чтобы отделить данные в сообщении об ошибке и облегчить их извлечение.

Последствия успешной инъекции

Если приложение уязвимо, злоумышленник может:

  • Получить версию MySQL, имя текущей базы данных, имя пользователя.
  • Извлечь таблицы, столбцы и их содержимое (например, логины и пароли).
  • При достаточных привилегиях — читать и записывать файлы на сервере, выполнять команды ОС.

Error-based инъекции особенно опасны, потому что не требуют слепого перебора и дают быстрый результат.

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

Основной метод — использование параметризованных запросов (prepared statements). Они разделяют код SQL и данные, поэтому внедрение команд невозможно.

Никогда не конкатенируйте пользовательский ввод в SQL-запросы. Даже если вы используете экранирование, всегда есть риск обойти его.

Дополнительные меры:

  • Валидация и фильтрация всех входных данных.
  • Ограничение прав пользователя базы данных (только необходимые привилегии).
  • Использование ORM и современных фреймворков, которые по умолчанию применяют параметризацию.
  • Регулярное обновление СУБД и веб-приложений.
  • Внедрение WAF (Web Application Firewall) для блокировки подозрительных запросов.

В частности, функция EXTRACTVALUE не должна использоваться с пользовательским вводом. Если она необходима, убедитесь, что аргументы строго контролируются.

Заключение

Запрос %")))) AND EXTRACTVALUE(2560,CONCAT(0x7e,((SELECT (ELT(2560=2560,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Понимание таких атак помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Помните: безопасность — это процесс, а не одноразовое действие.

Источники