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

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

Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм, в параметрах URL и в заголовках HTTP. Если вы увидели такую конструкцию у себя в логах — это почти наверняка попытка взлома, а не случайный набор символов.

Как работает эта инъекция?

Разберём payload по частям:

  • AND — логический оператор, который добавляется к исходному SQL-запросу, чтобы внедрить собственное условие.
  • EXTRACTVALUE(7252, ...) — функция MySQL, предназначенная для извлечения значения из XML-документа. Первый аргумент — XML-фрагмент, второй — XPath-выражение. Если XPath некорректен, MySQL выдаёт ошибку, в тексте которой отображается переданное значение.
  • CONCAT(0x7e, ..., 0x7e) — функция конкатенации, которая объединяет символ ~ (0x7e в шестнадцатеричном виде), результат подзапроса и ещё один ~. Символы тильды служат маркерами, чтобы в сообщении об ошибке было легко найти нужные данные.
  • (SELECT (ELT(7252=7252,1))) — подзапрос, который возвращает результат функции ELT(). ELT возвращает N-й элемент из списка. Здесь условие 7252=7252 всегда истинно, поэтому ELT возвращает первый элемент — число 1. Это простейшая проверка, что инъекция выполняется.
  • -- - — комментарий в SQL, который «отрезает» оставшуюся часть оригинального запроса, чтобы не возникло синтаксической ошибки.

В результате выполнения такого запроса MySQL попытается обработать XPath-выражение, содержащее символ ~, что недопустимо. База данных сгенерирует ошибку вида: XPATH syntax error: '~1~'. Именно эта ошибка и является «каналом утечки» — атакующий видит её на странице (если сайт выводит ошибки) и может подставлять вместо константы 1 другие SQL-выражения, например, имена таблиц или пароли пользователей.

Зачем злоумышленник использует именно 7252?

Число 7252 в данном случае — произвольное. Оно может быть любым, главное, чтобы условие 7252=7252 было истинным. Иногда вместо конкретного числа применяют случайные значения, чтобы обойти простые сигнатуры WAF (Web Application Firewall). В нашем примере число 7252 встречается дважды: как первый аргумент EXTRACTVALUE и внутри условия ELT. Это сделано для наглядности — показать, что функция ELT получает на вход логическое выражение.

Стоит отметить, что аналогичные payload’ы могут использовать и другие функции, например UPDATEXML() или GTID_SUBSET(). Все они относятся к error-based методу.

Чем опасна такая инъекция?

Error-based SQL-инъекция позволяет атакующему:

  • получить доступ к содержимому базы данных (логины, пароли, персональные данные);
  • изменить или удалить информацию в таблицах;
  • выполнить произвольные SQL-запросы с правами уязвимого приложения;
  • в некоторых случаях — выполнить команды на сервере (при наличии соответствующих привилегий).

Опасность усугубляется тем, что для эксплуатации не требуется сложного оборудования — достаточно браузера и базовых знаний SQL. Поэтому подобные строки в логах — серьёзный сигнал для администратора.

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

Основные меры профилактики:

  1. Использовать подготовленные выражения (prepared statements) с параметризацией запросов. Это самый надёжный способ предотвратить SQL-инъекции.
  2. Экранировать специальные символы во всех входных данных, особенно в тех, что попадают в SQL-запросы.
  3. Отключить вывод ошибок СУБД на продакшене — чтобы атакующий не видел текст ошибок. Ошибки должны логироваться, но не отображаться пользователю.
  4. Регулярно обновлять СУБД и CMS, чтобы закрыть известные уязвимости.
  5. Установить WAF (например, ModSecurity) для фильтрации подозрительных запросов.
  6. Проводить аудит кода и пентесты для выявления уязвимостей до того, как их найдут злоумышленники.

Что делать, если вы нашли такую строку в логах?

Во-первых, не паниковать. Во-вторых, проверить, не привела ли попытка к успеху: просмотрите логи базы данных на предмет необычных запросов, проверьте целостность данных. В-третьих, убедитесь, что на сайте не выводятся ошибки MySQL. В-четвёртых, если есть возможность, заблокируйте IP-адрес, с которого пришёл запрос. И самое главное — проведите аудит безопасности приложения.

Заключение

Строка AND EXTRACTVALUE(7252,CONCAT(0x7e,((SELECT (ELT(7252=7252,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка эксплуатации SQL-инъекции. Понимание механики таких атак помогает администраторам и разработчикам своевременно реагировать и защищать свои ресурсы.

Источники