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

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

Подобные строки часто встречаются в логах веб-серверов, в логах систем обнаружения вторжений (IDS) или в отчётах сканеров уязвимостей. Если вы увидели такую запись — это попытка взлома или тестирования на проникновение.

Разбор конструкции по частям

Давайте разберём, что означает каждый элемент.

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

В результате MySQL пытается интерпретировать строку вида ~1~ как XPath, что вызывает ошибку: XPATH syntax error: '~1~'. В этом сообщении и «утекают» данные.

Как работает error-based инъекция через EXTRACTVALUE

Механизм прост: злоумышленник заставляет базу данных выполнить подзапрос, результат которого попадает в текст ошибки. Поскольку приложение часто показывает ошибки СУБД пользователю (или они попадают в логи), атакующий может читать произвольные данные: версию MySQL, имена таблиц, столбцов, содержимое полей.

Например, подставив вместо 1 выражение (SELECT user()), можно получить имя текущего пользователя БД. А используя INFORMATION_SCHEMA, — перечислить все таблицы и колонки.

Функция EXTRACTVALUE — не единственная. Аналогично работают UPDATEXML, GTID_SUBSET, EXP (в старых версиях) и другие функции, возвращающие ошибку с контролируемым текстом.

Пример реальной атаки

Предположим, на сайте есть страница product.php?id=1, и запрос строится так:

SELECT * FROM products WHERE id = 1;

Злоумышленник передаёт в параметр id значение:

1 AND EXTRACTVALUE(7270,CONCAT(0x7e,(SELECT database()),0x7e))-- -

Итоговый запрос:

SELECT * FROM products WHERE id = 1 AND EXTRACTVALUE(7270,CONCAT(0x7e,(SELECT database()),0x7e))-- -;

MySQL выполнит подзапрос SELECT database(), получит имя текущей базы (например, shop_db), сформирует строку ~shop_db~ и попытается разобрать её как XPath. Возникнет ошибка: XPATH syntax error: '~shop_db~'. Если приложение выводит эту ошибку на экран, атакующий узнает имя базы.

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

Error-based SQL-инъекции позволяют полностью скомпрометировать базу данных:

  • Извлечь логины и пароли администраторов (часто в виде хешей, которые затем брутфорсятся).
  • Получить доступ к персональным данным пользователей.
  • Изменить или удалить информацию (если приложение использует того же пользователя БД с правами на запись).
  • В некоторых случаях — выполнить команды ОС через LOAD_FILE или записать веб-шелл в файл.

Особенно опасно, когда приложение возвращает детальные сообщения об ошибках. Именно поэтому в продакшене принято отключать вывод ошибок СУБД.

Как защититься от EXTRACTVALUE-инъекций

Основной метод — параметризованные запросы (prepared statements). Они исключают внедрение пользовательских данных в тело SQL-запроса. Дополнительные меры:

  • Использовать ORM (например, Hibernate, Entity Framework) или библиотеки с автоматическим экранированием.
  • Отключить вывод ошибок СУБД на экран (в PHP — display_errors = Off, в MySQL — не выводить детали в приложение).
  • Ограничить права пользователя БД: только необходимые операции, никаких FILE, LOAD_FILE и доступа к INFORMATION_SCHEMA (если возможно).
  • Регулярно обновлять СУБД и фреймворки.
  • Использовать WAF (Web Application Firewall) для фильтрации подозрительных конструкций, таких как EXTRACTVALUE, CONCAT(0x7e и т.п.

Важно понимать: фильтрация «чёрных списков» (запрет конкретных функций) — слабая защита, так как злоумышленник может использовать другие функции или кодировки. Надёжен только принцип «данные никогда не становятся кодом».

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

Если вы администратор и обнаружили подобный запрос в логах, это признак попытки взлома. Немедленно:

  1. Проверьте, не была ли атака успешной (ищите необычные записи в БД, новые файлы, изменения в коде).
  2. Обновите приложение и СУБД.
  3. Внедрите параметризованные запросы во всех местах, где есть работа с БД.
  4. Настройте вывод ошибок только в лог, а не пользователю.
  5. Установите WAF и ограничьте доступ к БД по IP.

Помните, что автоматические сканеры постоянно сканируют интернет на наличие уязвимостей. Даже если атака не удалась, она может повториться с другой полезной нагрузкой.

Заключение

Конструкция EXTRACTVALUE(7270,CONCAT(0x7e,...)) — это не случайный набор символов, а рабочий инструмент error-based SQL-инъекции. Понимание её механизма помогает разработчикам и администраторам лучше защищать свои системы. Главный вывод: никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.

Источники