Что это за строка?
Строка ))) 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и т.п.
Важно понимать: фильтрация «чёрных списков» (запрет конкретных функций) — слабая защита, так как злоумышленник может использовать другие функции или кодировки. Надёжен только принцип «данные никогда не становятся кодом».
Что делать, если вы нашли такую строку в логах
Если вы администратор и обнаружили подобный запрос в логах, это признак попытки взлома. Немедленно:
- Проверьте, не была ли атака успешной (ищите необычные записи в БД, новые файлы, изменения в коде).
- Обновите приложение и СУБД.
- Внедрите параметризованные запросы во всех местах, где есть работа с БД.
- Настройте вывод ошибок только в лог, а не пользователю.
- Установите WAF и ограничьте доступ к БД по IP.
Помните, что автоматические сканеры постоянно сканируют интернет на наличие уязвимостей. Даже если атака не удалась, она может повториться с другой полезной нагрузкой.
Заключение
Конструкция EXTRACTVALUE(7270,CONCAT(0x7e,...)) — это не случайный набор символов, а рабочий инструмент error-based SQL-инъекции. Понимание её механизма помогает разработчикам и администраторам лучше защищать свои системы. Главный вывод: никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.
Комментарии
—Войдите, чтобы оставить комментарий