Что это за строка?

Строка ") AND EXTRACTVALUE(5374,CONCAT(0x7e,((SELECT (ELT(5374=5374,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.

Подобные строки часто встречаются в отчётах об уязвимостях, в логах веб-серверов или в учебных материалах по пентесту. Они не являются вредоносным кодом сами по себе, но демонстрируют техники, применяемые злоумышленниками для получения несанкционированного доступа к информации.

Как работает EXTRACTVALUE?

Функция EXTRACTVALUE() в MySQL предназначена для извлечения значения из XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_document, XPath_expression). Если XPath-выражение некорректно, MySQL генерирует ошибку с текстом, содержащим фрагмент переданного выражения.

Злоумышленники используют эту особенность: они передают в качестве XPath строку, содержащую результат подзапроса, и сервер возвращает его в сообщении об ошибке. Например, EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e)) вызовет ошибку вида «XPATH syntax error: '~5.7.23~'», раскрывая версию СУБД.

Роль CONCAT и 0x7e

CONCAT() объединяет строки. Символ 0x7e — это шестнадцатеричное представление тильды (~). Тильда используется как маркер, чтобы отделить полезные данные от остального текста ошибки. Без разделителей извлечь информацию было бы сложнее.

Подзапрос с ELT

В нашем примере используется ELT(5374=5374,1). Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 5374=5374 — всегда истинное условие, которое преобразуется в 1, поэтому ELT возвращает строку «1». Это простейший тест: если инъекция сработает, сервер вернёт ошибку с числом 1. В реальных атаках вместо этого подзапроса подставляют вызовы системных функций или выборку данных из таблиц.

Разбор синтаксиса

  • ") — закрывает предыдущее строковое выражение и скобку в уязвимом запросе.
  • AND — логический оператор, добавляющий условие.
  • EXTRACTVALUE(5374, CONCAT(...)) — вызов функции, провоцирующий ошибку.
  • -- - — комментарий, отсекающий остаток оригинального SQL-запроса.

Вся конструкция внедряется в параметр, который попадает в SQL-запрос без должной обработки. Например, если приложение формирует запрос вида SELECT * FROM users WHERE name = '$input', то подстановка нашей строки приведёт к выполнению произвольного SQL-кода.

Зачем это нужно злоумышленнику?

Error-based инъекции — один из самых быстрых способов извлечения данных. В отличие от blind-инъекций, где приходится задавать множество вопросов «да/нет», здесь сервер сам возвращает запрошенную информацию в тексте ошибки. Это позволяет за один запрос получить имя базы, версию, имена таблиц и даже содержимое полей.

Однако для успешной эксплуатации необходимо, чтобы приложение выводило сообщения об ошибках СУБД пользователю. Если ошибки подавляются, метод не сработает.

Примеры других полезных нагрузок

Помимо EXTRACTVALUE, существуют аналогичные техники:

  • UPDATEXML — также генерирует XPath-ошибку.
  • GTID_SUBSET, JSON_KEYS и другие функции, вызывающие ошибки с полезной нагрузкой.
  • Комбинации с CONCAT и 0x7e для разделения данных.

Все они относятся к категории error-based и часто используются в инструментах автоматизации, таких как sqlmap.

Как защититься?

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

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

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

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

Распространённые ошибки при тестировании

Пентестеры иногда сталкиваются с тем, что EXTRACTVALUE не срабатывает. Причины:

  • Версия MySQL ниже 5.1 или выше 8.0 — поведение функции может отличаться.
  • Приложение использует не MySQL, а другую СУБД (PostgreSQL, MSSQL), где синтаксис иной.
  • Ошибки перехватываются и не выводятся.
  • В запросе уже есть свои кавычки, и внедряемая строка ломает синтаксис.

В таких случаях применяют другие типы инъекций: union-based, boolean-based, time-based.

Заключение

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

Источники