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

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

Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм, в параметрах URL. Для неподготовленного пользователя они выглядят как случайный набор символов, но на самом деле это тщательно сконструированная полезная нагрузка (payload), которая может привести к утечке данных.

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

Метод основан на том, что СУБД MySQL при определённых условиях возвращает в ответе сервера сообщение об ошибке, содержащее результат выполнения вложенного запроса. Злоумышленник намеренно вызывает такую ошибку, чтобы «вытащить» нужные данные.

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

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

  • '))) — закрывающие кавычки и скобки, которые «завершают» оригинальный SQL-запрос, чтобы внедрить свой код.
  • AND EXTRACTVALUE(9072, ...) — вызов функции EXTRACTVALUE с произвольным числом (9072) в качестве первого аргумента (XML-документ).
  • CONCAT(0x7e, ((SELECT (ELT(9072=9072,1)))), 0x7e) — конкатенация символа ~ (0x7e в шестнадцатеричном виде) с результатом подзапроса и ещё одним ~.
  • SELECT (ELT(9072=9072,1)) — подзапрос, возвращающий 1, если условие истинно. ELT() возвращает N-й элемент списка; здесь список состоит из одного элемента — 1.
  • -- - — комментарий, который «отрезает» оставшуюся часть оригинального запроса.

Цель инъекции

Основная цель — заставить сервер вернуть сообщение об ошибке, содержащее результат выполнения подзапроса. В данном примере подзапрос возвращает число 1, но в реальной атаке на его месте может быть, например, SELECT version(), SELECT database() или SELECT password FROM users LIMIT 1. Символы ~ используются как маркеры, чтобы облегчить извлечение данных из текста ошибки.

Если приложение не фильтрует входные данные и выводит ошибки СУБД пользователю, злоумышленник может последовательно извлекать имена таблиц, столбцов и содержимое базы.

Почему EXTRACTVALUE?

Функция EXTRACTVALUE() доступна в MySQL и MariaDB. Она часто используется в error-based инъекциях, потому что при передаче некорректного XPath-выражения возвращает ошибку вида XPATH syntax error: '...', в которую попадает переданная строка. Это позволяет внедрять произвольные данные в сообщение об ошибке.

Важно: начиная с MySQL 5.7.9 функция EXTRACTVALUE помечена как устаревшая, но продолжает работать во многих версиях.

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

Надёжная защита строится на комплексе мер:

  1. Использование подготовленных выражений (prepared statements). Это самый эффективный способ: данные передаются отдельно от SQL-кода и не могут изменить структуру запроса.
  2. Экранирование специальных символов. Если prepared statements недоступны, необходимо экранировать все пользовательские данные перед подстановкой в запрос.
  3. Отключение вывода ошибок СУБД. Сообщения об ошибках не должны попадать в ответ сервера; их следует логировать, а пользователю показывать общую страницу ошибки.
  4. Принцип наименьших привилегий. Учётная запись, от имени которой работает приложение, должна иметь только необходимые права.
  5. Регулярное обновление СУБД и фреймворков. Устаревшие версии могут содержать известные уязвимости.

Также рекомендуется использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов, но полагаться только на него нельзя.

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

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

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

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

Заключение

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

Источники