Что это за строка?
Строка %')) AND EXTRACTVALUE(3321,CONCAT(0x7e,((SELECT (ELT(3321=3321,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в логах веб-серверов, в полях ввода форм и в параметрах URL, когда злоумышленник пытается протестировать сайт на уязвимость.
Как работает инъекция?
Разберём по частям:
%'))— закрывает предыдущие скобки и кавычки в оригинальном SQL-запросе, чтобы внедрить свой код. Символ%— это URL-кодирование символа'(одинарная кавычка), который в SQL используется для строковых литералов.AND— логический оператор, присоединяющий вредоносное условие.EXTRACTVALUE(3321, CONCAT(0x7e, (SELECT (ELT(3321=3321,1))), 0x7e))— вызов XML-функции MySQL, которая извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой может оказаться результат подзапроса. Здесь3321— произвольное число (идентификатор),CONCATсклеивает строки,0x7e— шестнадцатеричное представление символа~(тильда), который служит маркером для облегчения поиска вывода в сообщении об ошибке.(SELECT (ELT(3321=3321,1)))— подзапрос, который возвращает1, если условие3321=3321истинно.ELT()возвращает N-й элемент из списка; здесь список состоит из одного элемента1. Это простейшая проверка, которая всегда возвращает1, но в реальной атаке вместо этого подзапроса внедряют выборку данных, например, версию СУБД, имя базы, логины и пароли.-- -— комментарий в SQL. Два дефиса и пробел (или дефис) означают, что весь оставшийся код запроса игнорируется. Это позволяет обрезать оригинальный запрос и не беспокоиться о его синтаксисе.
Цель атаки
Основная цель — заставить сервер вернуть сообщение об ошибке, содержащее полезные данные. MySQL при некорректном XPath-выражении в EXTRACTVALUE выдаёт ошибку вида: XPATH syntax error: '~результат~'. Злоумышленник подставляет в подзапрос SELECT нужные ему поля (например, SELECT version(), SELECT database(), SELECT password FROM users LIMIT 1), и они попадают в текст ошибки, который отображается на странице или возвращается в ответе API.
Какие данные можно извлечь?
При успешной эксплуатации уязвимости атакующий может получить:
- версию MySQL и операционной системы;
- имя текущей базы данных;
- список таблиц и колонок;
- учётные данные пользователей (логины, хеши паролей);
- любые другие данные, доступные приложению.
Всё это происходит без прямого доступа к файловой системе или консоли сервера — только через HTTP-запросы.
Почему EXTRACTVALUE?
Функция EXTRACTVALUE (и её «сестра» UPDATEXML) часто использовалась в error-based инъекциях, потому что она гарантированно вызывает ошибку при неправильном XPath и выводит переданную строку в сообщении. Начиная с MySQL 5.7.9 и в MariaDB эти функции были удалены или изменены, поэтому в современных СУБД такой вектор может не сработать. Однако в устаревших системах (MySQL 5.1–5.6) он всё ещё актуален.
Как защититься?
Основной способ защиты — использовать параметризованные запросы (prepared statements) и никогда не вставлять пользовательский ввод напрямую в SQL. Также помогают:
- валидация и фильтрация входных данных;
- экранирование специальных символов;
- ограничение прав пользователя базы данных (только необходимые операции);
- отключение вывода подробных ошибок на продакшене;
- регулярное обновление СУБД и веб-приложений.
Если вы обнаружили подобную строку в логах, это сигнал о попытке взлома. Стоит проверить код на наличие уязвимостей и принять меры.
Заключение
Рассмотренная строка — не случайный набор символов, а чётко сконструированная полезная нагрузка для проверки и эксплуатации SQL-инъекции. Понимание её структуры помогает специалистам по безопасности быстрее распознавать атаки и закрывать уязвимости. Если вы не эксперт, но увидели такое в логах своего сайта, рекомендуется обратиться к разработчикам или в службу ИБ.
Комментарии
—Войдите, чтобы оставить комментарий