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

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

Внешне это выглядит как бессмысленный набор символов, но на самом деле каждый элемент здесь имеет строгое назначение. Давайте разберём его по частям.

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

Начнём с конца: -- - — это комментарий в SQL. Всё, что идёт после него, игнорируется парсером. Это нужно, чтобы обрезать остаток оригинального запроса, который мог бы помешать выполнению вредоносной части.

Далее: ) — закрывающая скобка. Она используется, чтобы «закрыть» ранее открытую скобку в уязвимом запросе, если таковая имеется. Это позволяет внедрить свой код в нужное место.

Затем идёт AND EXTRACTVALUE(3029, CONCAT(0x7e, ((SELECT (ELT(3029=3029,1)))), 0x7e)). Это и есть ядро инъекции.

Функция EXTRACTVALUE

EXTRACTVALUE — это встроенная функция MySQL (и некоторых других СУБД), предназначенная для работы с XML. Она принимает два аргумента: XML-документ и XPath-выражение, и возвращает значение узла, соответствующего этому выражению.

Однако при неправильном использовании она генерирует ошибку, текст которой содержит переданные данные. Это и есть основа error-based инъекции.

В нашем случае первым аргументом идёт число 3029. Оно не является корректным XML-документом, поэтому функция должна выдать ошибку. Но перед этим она попытается вычислить второй аргумент — XPath-выражение.

Функция CONCAT и шестнадцатеричные литералы

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

Внутри CONCAT находится подзапрос: (SELECT (ELT(3029=3029,1))).

Функция ELT и условие 3029=3029

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Если N=1, возвращается первая строка. В нашем случае ELT(3029=3029, 1) — здесь первый аргумент это логическое выражение 3029=3029, которое всегда истинно (равно 1). Таким образом, ELT вернёт строку '1'.

Подзапрос (SELECT (ELT(3029=3029,1))) просто вернёт '1'.

Итак, XPath-выражение, которое передаётся в EXTRACTVALUE, будет выглядеть как ~1~. Это не является корректным XPath, поэтому EXTRACTVALUE сгенерирует ошибку примерно такого содержания:

XPATH syntax error: '~1~'

В сообщении об ошибке появятся символы между тильдами — в данном случае '1'. Именно так злоумышленник может извлечь данные: подставляя вместо '1' другие SQL-выражения, он получит их результат в тексте ошибки.

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

Цель — получить информацию из базы данных, когда обычные методы (например, UNION-инъекции) не работают. Error-based инъекция позволяет посимвольно извлекать данные: имена таблиц, колонок, логины, пароли и т.д. В данном примере демонстрируется базовый шаблон, который можно модифицировать для получения конкретных данных.

Пример реальной атаки

Предположим, есть уязвимый параметр id в URL: example.com/product?id=1. Запрос на сервере может выглядеть так:

SELECT * FROM products WHERE id = (1) AND ...

Злоумышленник подставляет нашу строку вместо 1, и запрос превращается в:

SELECT * FROM products WHERE id = (1) AND EXTRACTVALUE(3029,CONCAT(0x7e,((SELECT (ELT(3029=3029,1)))),0x7e))-- -

Сервер выполняет запрос, EXTRACTVALUE вызывает ошибку, и в ответе клиент видит сообщение с внедрёнными данными.

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

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

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

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

Важно понимать, что error-based инъекции — лишь один из многих типов атак. Полноценная защита требует комплексного подхода.

Заключение

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

Если вы нашли подобную строку в логах или входных данных, это серьёзный сигнал о попытке взлома. Немедленно проверьте свой код на наличие уязвимостей и примите меры.

Источники