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

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

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

Разбор по частям

EXTRACTVALUE

EXTRACTVALUE(XML_fragment, XPath_expression) — функция MySQL для извлечения значения из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой может отображаться переданный фрагмент. Именно это и эксплуатируют хакеры.

CONCAT и 0x7e

CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — это шестнадцатеричный код символа ~ (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти внедрённые данные: они будут заключены между двумя тильдами.

ELT и условие 8107=8107

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(8107=8107, 1) — условие 8107=8107 всегда истинно, поэтому ELT вернёт 1. Это простейший пример; в реальных атаках вместо 1 подставляются имена таблиц, столбцов, версии СУБД и другие данные. Число 8107 — произвольное, часто генерируется случайно для уникальности.

Комментарий -- -

Двойной дефис с пробелом (-- ) или -- - — это комментарий в SQL, который отсекает оставшуюся часть оригинального запроса, чтобы инъекция не вызвала синтаксическую ошибку.

Как это работает на практике

Предположим, на сервере выполняется запрос:

SELECT * FROM articles WHERE id = 'введённые_данные';

Злоумышленник подставляет вместо введённые_данные нашу строку. Запрос превращается в:

SELECT * FROM articles WHERE id = '%" AND EXTRACTVALUE(8107,CONCAT(0x7e,((SELECT (ELT(8107=8107,1)))),0x7e))-- -';

MySQL пытается выполнить EXTRACTVALUE с XPath-выражением, содержащим тильды и результат подзапроса. Поскольку XPath-выражение некорректно (начинается с тильды), СУБД возвращает ошибку вида:

XPATH syntax error: '~1~'

В этом сообщении злоумышленник видит результат выполнения подзапроса. Меняя содержимое ELT или добавляя другие функции, можно извлекать произвольные данные: версию MySQL, имя текущей базы, таблицы, логины и пароли пользователей.

Зачем это нужно злоумышленнику

  • Разведка: получение версии СУБД, имени базы данных, текущего пользователя.
  • Извлечение данных: посимвольное чтение содержимого таблиц (например, users с паролями).
  • Обход фильтров: если прямое объединение UNION SELECT блокируется, error-based инъекции часто проходят.
  • Автоматизация: существуют инструменты (sqlmap), которые автоматически эксплуатируют такие уязвимости.

Чем опасна error-based инъекция

Успешная эксплуатация приводит к полной компрометации базы данных. Злоумышленник может:

  • украсть персональные данные пользователей;
  • изменить или удалить информацию;
  • получить доступ к административной панели;
  • использовать сервер для дальнейших атак.

Даже если сайт не хранит критичных данных, через SQL-инъекцию можно получить доступ к файловой системе или выполнить команды ОС (при определённых правах).

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

  1. Параметризованные запросы (prepared statements). Это самый надёжный способ. Данные передаются отдельно от SQL-кода, и СУБД не интерпретирует их как часть запроса.
  2. Хранимые процедуры. Если они написаны корректно, риск инъекций снижается.
  3. Экранирование специальных символов. Например, функция mysqli_real_escape_string в PHP, но это менее надёжно, чем параметризация.
  4. Валидация и фильтрация входных данных. Проверяйте типы, длины, допустимые символы. Не доверяйте данным от пользователя.
  5. Минимальные привилегии для пользователя БД. Веб-приложение не должно работать под root. Ограничьте права только необходимыми операциями.
  6. Регулярное обновление СУБД и фреймворков. Устаревшие версии могут содержать дополнительные уязвимости.
  7. WAF (Web Application Firewall). Помогает блокировать типовые атаки, но не заменяет правильное кодирование.
  8. Логирование и мониторинг. Анализируйте подозрительные запросы, чтобы вовремя обнаружить попытки взлома.

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

Если вы администратор сайта и видите подобные записи:

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

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

Краткий итог

Строка с EXTRACTVALUE, CONCAT и ELT — это попытка error-based SQL-инъекции в MySQL. Она позволяет злоумышленнику извлекать данные через сообщения об ошибках. Защита строится на параметризованных запросах, ограничении прав и регулярном обновлении ПО. Если вы встретили такую строку — отнеситесь к ней как к инциденту безопасности.

Источники