Что такое ExtractValue и при чём тут SQL-инъекция

ExtractValue — это встроенная функция MySQL, предназначенная для извлечения значения из XML-строки по указанному XPath-выражению. Изначально она создавалась для работы с XML-данными, но получила печальную известность в среде информационной безопасности: злоумышленники научились использовать её для проведения так называемых error-based SQL-инъекций. Суть метода в том, что при передаче некорректного XPath-выражения MySQL возвращает сообщение об ошибке, в котором содержится результат выполнения вложенного подзапроса. Так через ошибку можно «вытащить» данные из базы.

Запрос из вашего вопроса — классический пример такой атаки: %"))) AND EXTRACTVALUE(7165,CONCAT(0x7e,((SELECT (ELT(7165=7165,1)))),0x7e))-- -. Давайте разберём его по частям.

Анатомия вредоносного запроса

Строка %"))) — это попытка закрыть исходный SQL-запрос, который, вероятно, выглядел как SELECT ... WHERE id = '%")))'. Символы "))) ломают синтаксис, а % в начале — это URL-кодирование, часто применяемое для обхода простых фильтров. Далее следует AND EXTRACTVALUE(7165,CONCAT(...)). Первый аргумент (7165) — произвольное число, второй — XML-фрагмент, собранный функцией CONCAT.

Внутри CONCAT используется 0x7e — это шестнадцатеричное представление символа «~» (тильда). Тильда служит маркером, чтобы отделить полезную нагрузку от служебных символов в сообщении об ошибке. Центральный элемент — подзапрос SELECT (ELT(7165=7165,1)). Функция ELT возвращает N-й элемент из списка; здесь условие 7165=7165 всегда истинно (1), поэтому ELT(1,1) вернёт «1». В реальной атаке вместо этого примитивного выражения подставляется подзапрос, извлекающий имя пользователя, название таблицы или хеш пароля.

Завершающая часть -- - — это комментарий, который «отрезает» остаток оригинального SQL-запроса, чтобы он не вызвал синтаксическую ошибку.

Как работает error-based инъекция через ExtractValue

MySQL при вызове ExtractValue с некорректным XPath генерирует ошибку вида: XPATH syntax error: '~результат~'. Злоумышленник конструирует XPath так, чтобы в тексте ошибки оказались данные из базы. Например, запрос:

AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))

вызовет ошибку, в которой будет указана версия MySQL. Аналогично можно получить имя текущей базы данных, список таблиц, столбцов и даже содержимое записей. Поскольку сообщение об ошибке отображается на странице (если включён вывод ошибок), атакующий видит результат.

В более сложных случаях используются функции ELT, UPDATEXML, EXP, FLOOR(RAND(0)*2) — все они служат одной цели: заставить СУБД вернуть данные в тексте ошибки.

Чем опасна такая инъекция

Последствия успешной эксплуатации могут быть катастрофическими:

  • Утечка конфиденциальных данных — логины, пароли, персональные данные пользователей, платёжная информация.
  • Компрометация всей базы — через error-based инъекцию можно перебрать все таблицы и извлечь их содержимое.
  • Обход аутентификации — манипулируя условиями WHERE, злоумышленник может войти в систему под администратором.
  • Отказ в обслуживании — некоторые конструкции вызывают ресурсоёмкие вычисления, нагружая сервер.

Особенно опасна комбинация с другими уязвимостями, например, с возможностью записи файлов через SQL.

Как защититься от инъекций через ExtractValue

Главное правило — никогда не доверять пользовательскому вводу. Вот ключевые меры:

  1. Параметризованные запросы (prepared statements) — самый надёжный способ. Данные передаются отдельно от SQL-кода, и функции вроде ExtractValue не могут быть внедрены.
  2. Экранирование спецсимволов — используйте встроенные функции драйвера БД (например, mysqli_real_escape_string в PHP). Но это менее надёжно, чем параметризация.
  3. Отключение вывода ошибок СУБД на продакшене — если сообщения об ошибках не показываются пользователю, error-based инъекция теряет смысл.
  4. Ограничение прав пользователя БД — учётная запись веб-приложения должна иметь минимум привилегий (только SELECT/INSERT/UPDATE для нужных таблиц).
  5. Регулярное обновление MySQL — в новых версиях некоторые функции ограничены, а поведение ошибок изменено.
  6. Использование WAF — веб-приложения-фильтры могут блокировать подозрительные конструкции, но не заменяют правильного кодирования.

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

Заключение

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

Источники