Что это за строка?
Перед нами классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Подобные конструкции используются злоумышленниками для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер базы данных. Строка %'))) AND EXTRACTVALUE(8704,CONCAT(0x7e,((SELECT (ELT(8704=8704,1)))),0x7e))-- - — это часть внедряемого SQL-кода, маскирующаяся под пользовательский ввод.
Разбор по частям
Давайте разберём каждый элемент этой инъекции.
- %'))) — это начало, которое часто используется для «закрытия» предыдущих кавычек и скобок в уязвимом SQL-запросе. Символ
%может быть частью URL-кодирования или просто мусором для обхода простых фильтров. Далее идут закрывающие кавычка и скобки, чтобы синтаксис стал корректным. - AND — логический оператор, присоединяющий наше условие к оригинальному запросу.
- EXTRACTVALUE(8704, ...) — вызов функции MySQL, которая извлекает значение из XML-документа по XPath-выражению. Первый аргумент (8704) — это произвольное число, которое не влияет на результат, но нужно для синтаксиса. Второй аргумент — XPath-выражение, которое мы формируем.
- CONCAT(0x7e, ..., 0x7e) — функция конкатенации.
0x7e— это шестнадцатеричное представление символа~(тильда). Тильда добавляется в начало и конец, чтобы отделить полезную нагрузку в сообщении об ошибке. - (SELECT (ELT(8704=8704,1))) — подзапрос, возвращающий значение.
ELT()— функция, возвращающая N-й элемент из списка. Здесь8704=8704— всегда истинное условие (1), поэтомуELT(1,1)вернёт1. Это простейший пример, но на практике вместо1подставляются имена таблиц, колонок или другие данные. - -- - — комментарий, который «съедает» оставшуюся часть оригинального запроса, чтобы не возникало синтаксических ошибок.
Как это работает
MySQL при попытке разобрать XPath-выражение, содержащее недопустимые символы (например, тильду), генерирует ошибку вида: XPATH syntax error: '~1~'. Эта ошибка возвращается клиенту. Злоумышленник, видя её, понимает, что инъекция сработала, и может заменить 1 на любой другой запрос, например, (SELECT database()), чтобы получить имя текущей базы данных. Таким образом, через ошибки можно пошагово извлекать произвольную информацию.
Пример ошибки: ERROR 1105 (HY000): XPATH syntax error: '~1~'
Важно: функция EXTRACTVALUE удалена в MySQL 8.0.4 и заменена на UPDATEXML, но в старых версиях (5.7 и ниже) она всё ещё работает. Именно поэтому подобные payload'ы встречаются в старых системах.
Зачем это нужно злоумышленнику
Error-based инъекции — один из самых быстрых способов извлечения данных, так как не требуют слепого перебора. Если веб-приложение выводит сообщения об ошибках СУБД, атакующий может получить:
- версию MySQL,
- имя текущей базы данных,
- список таблиц и колонок,
- непосредственно данные (логины, пароли, персональную информацию).
Строка с ELT(8704=8704,1) — это тестовый запрос, чтобы убедиться, что инъекция возможна. Если ошибка появляется, значит, приложение уязвимо.
Как защититься
Основные меры противодействия:
- Использовать подготовленные выражения (prepared statements) с параметризацией — это самый надёжный способ.
- Экранировать все пользовательские данные перед вставкой в SQL-запрос.
- Отключить вывод ошибок СУБД на продакшене, чтобы злоумышленник не получал подсказок.
- Регулярно обновлять MySQL до версии 8.0.4+, где
EXTRACTVALUEудалена. - Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Если вы обнаружили такую строку в логах, это сигнал о попытке взлома. Необходимо срочно проверить код приложения на наличие уязвимостей и провести аудит безопасности.
Вывод
Строка %'))) AND EXTRACTVALUE(8704,CONCAT(0x7e,((SELECT (ELT(8704=8704,1)))),0x7e))-- - — это типичный пример эксплуатации error-based SQL-инъекции в MySQL через функцию EXTRACTVALUE. Она демонстрирует, как можно использовать ошибки XPath для извлечения данных. Понимание таких конструкций важно для специалистов по безопасности и разработчиков, чтобы своевременно закрывать уязвимости.
Комментарии
—Войдите, чтобы оставить комментарий