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

Строка %')) 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-инъекции. Понимание её структуры помогает специалистам по безопасности быстрее распознавать атаки и закрывать уязвимости. Если вы не эксперт, но увидели такое в логах своего сайта, рекомендуется обратиться к разработчикам или в службу ИБ.

Источники