Что это за строка?
Строка "))) AND EXTRACTVALUE(9584,CONCAT(0x7e,((SELECT (ELT(9584=9584,1)))),0x7e))-- - — это классический пример SQL-инъекции, нацеленной на извлечение данных из базы данных через функцию EXTRACTVALUE. Подобные запросы часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Они выглядят как бессмысленный набор символов, но на самом деле это тщательно сконструированная атака.
В данной статье мы разберём, как работает эта инъекция, какие механизмы СУБД она использует и как защититься от подобных угроз.
Разбор компонентов инъекции
Давайте разложим строку на составные части, чтобы понять логику атакующего.
1. Закрывающие скобки и AND
Начало "))) — это попытка закрыть ранее открытые скобки в оригинальном SQL-запросе. Злоумышленник предполагает, что исходный запрос содержит несколько вложенных условий, и добавляет три закрывающие скобки, чтобы «выйти» из них. Затем следует AND — логический оператор, который присоединяет вредоносное условие к исходному запросу.
2. Функция EXTRACTVALUE
EXTRACTVALUE — это функция MySQL (и MariaDB), предназначенная для извлечения значения из XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_fragment, XPath_expression). Однако хакеры используют её особенность: если XPath-выражение содержит ошибку, MySQL возвращает сообщение об ошибке, в котором отображается часть переданного XPath. Это позволяет извлекать данные через ошибки — так называемая error-based SQL injection.
3. CONCAT и маркеры 0x7e
CONCAT(0x7e, ..., 0x7e) объединяет строки. Здесь 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер начала и конца извлекаемых данных, чтобы облегчить их поиск в сообщении об ошибке.
4. Подзапрос с ELT
Внутри CONCAT находится подзапрос: (SELECT (ELT(9584=9584,1))). Функция ELT возвращает N-й элемент из списка. Здесь 9584=9584 — всегда истинное условие, поэтому ELT возвращает 1. Это простейший случай: атакующий проверяет работоспособность инъекции. В реальной атаке вместо 1 мог бы быть, например, version() или database().
5. Комментарий -- -
Завершающая часть -- - — это комментарий в SQL. Два дефиса и пробел (или дефис) заставляют СУБД игнорировать остаток исходного запроса. Это необходимо, чтобы «отрезать» лишние кавычки или условия, которые могли бы нарушить синтаксис.
Как это работает на практике
Предположим, исходный запрос выглядит так:
SELECT * FROM users WHERE id = '))) AND EXTRACTVALUE(9584,CONCAT(0x7e,((SELECT (ELT(9584=9584,1)))),0x7e))-- -'
После подстановки пользовательского ввода запрос превращается в:
SELECT * FROM users WHERE id = ''))) AND EXTRACTVALUE(9584,CONCAT(0x7e,((SELECT (ELT(9584=9584,1)))),0x7e))-- -'
MySQL выполняет запрос. Функция EXTRACTVALUE пытается разобрать XPath, который содержит символ ~ и результат подзапроса. Поскольку XPath некорректен, MySQL генерирует ошибку вида:
XPATH syntax error: '~1~'
Эта ошибка возвращается клиенту (если вывод ошибок не подавлен). Атакующий видит ~1~ и понимает, что инъекция работает. Далее он может заменить 1 на вызов любой функции, например version(), и получить версию СУБД.
Цели атакующего
Подобные инъекции используются для:
- Получения версии базы данных и сервера.
- Извлечения имён таблиц и колонок.
- Чтения конфиденциальных данных (логины, пароли, персональная информация).
- Обхода аутентификации.
- Выполнения административных операций (в зависимости от прав).
Конкретно эта строка — тестовая. Она проверяет, уязвим ли параметр к error-based инъекциям.
Почему EXTRACTVALUE опасна?
Функция EXTRACTVALUE не предназначена для вывода данных, но из-за особенности обработки ошибок XPath она стала популярным инструментом в арсенале пентестеров. Аналогичными свойствами обладают UPDATEXML и GTID_SUBSET. Эти функции позволяют злоумышленнику получать данные через сообщения об ошибках, даже если прямой вывод запрещён.
Как защититься от SQL-инъекций
Основной метод защиты — использование параметризованных запросов (prepared statements). Это исключает возможность подстановки вредоносного кода, так как данные передаются отдельно от SQL-структуры. Дополнительные меры:
- Валидация и фильтрация входных данных.
- Ограничение прав пользователя базы данных (принцип наименьших привилегий).
- Отключение вывода подробных ошибок в production-среде.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
- Регулярное обновление СУБД и фреймворков.
Важно понимать, что фильтрация по чёрным спискам (например, удаление слова EXTRACTVALUE) неэффективна: злоумышленник может использовать обфускацию, комментарии, регистр и другие трюки.
Вывод
Строка "))) AND EXTRACTVALUE(9584,CONCAT(0x7e,((SELECT (ELT(9584=9584,1)))),0x7e))-- - — это не случайный набор символов, а продуманная SQL-инъекция, эксплуатирующая функцию EXTRACTVALUE для извлечения данных через ошибки. Если вы встретили подобное в логах, это признак попытки взлома. Немедленно проверьте свой код на уязвимости и внедрите параметризованные запросы.
Комментарии
—Войдите, чтобы оставить комментарий