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

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

В основе лежит функция EXTRACTVALUE(), которая извлекает значение из XML-строки по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой отображается переданный фрагмент. Это позволяет атакующему «вытащить» произвольные данные, подставив их в XPath.

Разбор компонентов инъекции

1. Закрывающая кавычка и скобка

Начало строки ") — это попытка закрыть предыдущее значение в SQL-запросе. В зависимости от контекста, это может быть закрытие строкового литерала и круглой скобки, чтобы внедрить собственный код. Символ " экранирует кавычку, если она уже была внутри строки, но в данном случае это часть payload.

2. Оператор AND

Оператор AND используется для добавления условия. Если предыдущая часть запроса верна, то выполнится и инъекция. Это позволяет обойти некоторые фильтры и гарантировать выполнение вредоносного кода.

3. Функция EXTRACTVALUE

EXTRACTVALUE(1235, CONCAT(0x7e, ((SELECT (ELT(1235=1235,1)))), 0x7e)) — центральный элемент. Первый аргумент (1235) — это XML-документ (в данном случае просто число, которое не является валидным XML, но это не важно). Второй аргумент — XPath-выражение, которое формируется динамически.

  • 0x7e — шестнадцатеричное представление символа ~ (тильда). Он используется как разделитель, чтобы облегчить поиск выводимых данных в сообщении об ошибке.
  • CONCAT объединяет тильду, результат подзапроса и ещё одну тильду.
  • SELECT (ELT(1235=1235,1)) — подзапрос, который возвращает 1, так как условие 1235=1235 всегда истинно. Функция ELT() возвращает N-й элемент из списка; здесь список состоит из одного элемента — числа 1. Это простейший пример; на практике вместо 1 подставляется выражение для извлечения данных, например, (SELECT version()) или (SELECT table_name FROM information_schema.tables LIMIT 1).

4. Комментарий -- -

Последовательность -- - (дефис-дефис-пробел-дефис) — это комментарий в MySQL. Он «съедает» остаток оригинального запроса, чтобы синтаксис оставался корректным. Пробел после двух дефисов обязателен в некоторых версиях MySQL, а дополнительный дефис часто используется для обхода фильтров, удаляющих комментарии.

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

MySQL при вызове EXTRACTVALUE() с некорректным XPath возвращает ошибку вида: XPATH syntax error: '~результат~'. Атакующий подставляет в XPath подзапрос, возвращающий нужные данные, и они отображаются в тексте ошибки. Это один из самых надёжных способов извлечения информации, так как не требует вывода данных на страницу.

Строка с ELT(1235=1235,1) — это упрощённый пример, демонстрирующий работоспособность метода. В реальных атаках вместо 1 подставляются вызовы SELECT к системным таблицам, например:

AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables LIMIT 0,1), 0x7e))

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

Меры защиты

Чтобы предотвратить такие атаки, необходимо:

  • Использовать подготовленные выражения (prepared statements) с параметризацией запросов.
  • Применять ORM, которые автоматически экранируют опасные символы.
  • Ограничить права пользователя базы данных, чтобы даже при инъекции нельзя было читать системные таблицы.
  • Включить логирование и мониторинг подозрительных запросов.
  • Регулярно обновлять СУБД и применять патчи безопасности.

Важно понимать, что error-based инъекции — лишь один из многих векторов атак. Комплексный подход к безопасности включает валидацию входных данных, экранирование и минимизацию привилегий.

Заключение

Рассмотренная строка — типичный пример эксплуатации уязвимости error-based SQL-инъекции в MySQL. Она демонстрирует, как с помощью функций EXTRACTVALUE и CONCAT можно извлечь произвольные данные через сообщения об ошибках. Понимание таких конструкций помогает разработчикам и специалистам по безопасности лучше защищать свои приложения.

Источники