Что это за строка?
Строка ') AND EXTRACTVALUE(3991,CONCAT(0x7e,((SELECT (ELT(3991=3991,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для внедрения в уязвимый SQL-запрос с целью заставить базу данных вернуть данные через сообщение об ошибке.
Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм, в параметрах URL. Для неподготовленного человека они выглядят как случайный набор символов, но на самом деле это тщательно сконструированная атака.
Введение. Встречая в логах или в поле ввода подобную строку: ') AND EXTRACTVALUE(7289,CONCAT(0x7e,((SELECT (ELT(7289=7289,1)))),0x7e))-- -, многие задаются вопросом: что это и какова её цель? Это классический пример SQL-инъекции, нацеленной на извлечение данных.
Разбор по частям
Чтобы понять смысл, разберём строку на составляющие:
')— закрывает ранее открытую скобку и кавычку в уязвимом запросе, разрывая исходную конструкцию.AND— логический оператор, присоединяющий дополнительное условие.EXTRACTVALUE(3991, ...)— функция MySQL для работы с XML. Первый аргумент — XML-фрагмент (здесь просто число 3991).CONCAT(0x7e, ..., 0x7e)— конкатенация строк.0x7e— это шестнадцатеричный код символа~(тильда).(SELECT (ELT(3991=3991,1)))— подзапрос, возвращающий 1, если условие истинно (3991=3991 всегда истинно).-- -— комментарий, обрезающий остаток исходного запроса.
Как работает EXTRACTVALUE
Функция EXTRACTVALUE() принимает два строковых аргумента: фрагмент XML-разметки и выражение XPath (локатор). Она возвращает текст (CDATA) первого текстового узла, который является дочерним для элемента или элементов, соответствующих выражению XPath.
Ключевая особенность: если XPath-выражение синтаксически некорректно, MySQL генерирует ошибку, в тексте которой отображается переданное значение. Именно это и используется для извлечения данных.
В нашем случае в XPath подставляется результат CONCAT(0x7e, (SELECT ...), 0x7e). Тильда ~ делает выражение невалидным, и MySQL выдаёт ошибку вида:
XPATH syntax error: '~1~'
Атакующий видит результат подзапроса в сообщении об ошибке. В данном примере это просто «1», но на месте подзапроса может быть любое поле из базы данных: имя пользователя, пароль, номер карты.
Цель атаки
Error-based SQL-инъекция через EXTRACTVALUE позволяет злоумышленнику извлекать произвольные данные из базы, даже если приложение не выводит результаты запроса на экран. Достаточно, чтобы ошибки СУБД отображались в ответе сервера.
Типичные цели:
- Получение структуры базы данных (имена таблиц, колонок).
- Извлечение учётных записей пользователей.
- Кража конфиденциальной информации (персональные данные, платёжные реквизиты).
- Обход аутентификации.
Почему это работает
Уязвимость возникает, когда приложение подставляет пользовательский ввод в SQL-запрос без должной обработки. Например, в коде:
$query = "SELECT * FROM users WHERE id = '$id'";
Если в $id передать нашу строку, запрос превратится в нечто вроде:
SELECT * FROM users WHERE id = '') AND EXTRACTVALUE(3991,CONCAT(0x7e,((SELECT (ELT(3991=3991,1)))),0x7e))-- -'
Кавычка и скобка закрывают исходное условие, а дальше выполняется внедрённый код.
Как защититься
Основной способ защиты — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому пользовательский ввод не может изменить структуру запроса.
Дополнительные меры:
- Экранирование специальных символов.
- Валидация входных данных (например, приведение к числу, если ожидается число).
- Отключение вывода подробных ошибок СУБД в production.
- Использование ORM с безопасными методами построения запросов.
- Регулярный аудит кода и пентесты.
Что делать, если вы нашли такую строку в логах
Если вы обнаружили подобную запись в логах своего сайта, это может означать, что кто-то пытался просканировать ресурс на уязвимости. Не паникуйте, но проверьте:
- Обновлены ли все компоненты CMS и библиотеки.
- Используются ли параметризованные запросы в коде.
- Настроено ли логирование и мониторинг подозрительной активности.
- Ограничен ли доступ к базе данных (принцип наименьших привилегий).
В большинстве случаев такие попытки — это автоматизированные сканеры, но игнорировать их нельзя.
Итог
Строка ') AND EXTRACTVALUE(3991,CONCAT(0x7e,((SELECT (ELT(3991=3991,1)))),0x7e))-- - — это не случайный мусор, а рабочий эксплойт для error-based SQL-инъекции в MySQL. Понимание принципов его работы помогает разработчикам и администраторам лучше защищать свои системы.
Комментарии
—Войдите, чтобы оставить комментарий