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

Строка ') 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 позволяет злоумышленнику извлекать произвольные данные из базы, даже если приложение не выводит результаты запроса на экран. Достаточно, чтобы ошибки СУБД отображались в ответе сервера.

Типичные цели:

  1. Получение структуры базы данных (имена таблиц, колонок).
  2. Извлечение учётных записей пользователей.
  3. Кража конфиденциальной информации (персональные данные, платёжные реквизиты).
  4. Обход аутентификации.

Почему это работает

Уязвимость возникает, когда приложение подставляет пользовательский ввод в 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 с безопасными методами построения запросов.
  • Регулярный аудит кода и пентесты.

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

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

  1. Обновлены ли все компоненты CMS и библиотеки.
  2. Используются ли параметризованные запросы в коде.
  3. Настроено ли логирование и мониторинг подозрительной активности.
  4. Ограничен ли доступ к базе данных (принцип наименьших привилегий).

В большинстве случаев такие попытки — это автоматизированные сканеры, но игнорировать их нельзя.

Итог

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

Источники