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

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

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

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

Давайте разберём строку на составляющие, чтобы понять логику атаки.

  • " — двойная кавычка. Используется для закрытия строкового литерала в исходном SQL-запросе, чтобы далее можно было вставить произвольный код.
  • OR — логический оператор. Применяется для того, чтобы условие инъекции сработало, даже если первая часть запроса ложна.
  • EXTRACTVALUE(9490, CONCAT(...)) — функция MySQL, которая извлекает значение из XML-документа. Если второй аргумент не является корректным XPath-выражением, функция генерирует ошибку, в тексте которой выводится переданная строка. Это и есть канал утечки данных.
  • CONCAT(0x7e, ((SELECT (ELT(9490=9490,1)))), 0x7e) — конкатенация символа ~ (0x7e), результата подзапроса и снова ~. Символ ~ используется как маркер, чтобы легко найти выведенные данные в сообщении об ошибке.
  • SELECT (ELT(9490=9490,1)) — подзапрос, возвращающий значение. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 9490=9490 — всегда истина (1), поэтому ELT(1,1) вернёт 1. В реальной атаке вместо этого подзапроса стоял бы запрос к системным таблицам, например, SELECT version() или SELECT user().
  • -- - — комментарий в SQL. Всё, что идёт после него, игнорируется. Пробел после -- обязателен в некоторых СУБД, отсюда -- - (дефис для надёжности).

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

Обычно при SQL-инъекции злоумышленник пытается получить данные, изменяя логику запроса. Но если приложение не выводит результаты запроса на экран, на помощь приходят ошибки. MySQL-функции EXTRACTVALUE и UPDATEXML при неправильном XPath-выражении возвращают ошибку вида:

XPATH syntax error: '~5.7.32~'

В этом примере ~5.7.32~ — это версия MySQL, которая была подставлена в качестве аргумента. Злоумышленник может заменить подзапрос на любой другой, например, SELECT password FROM users LIMIT 1, и получить хеш пароля прямо в тексте ошибки.

Таким образом, даже если сайт не показывает данные напрямую, ошибки базы данных могут стать каналом утечки. Это делает error-based инъекции очень эффективными.

Зачем нужен ELT и CONCAT?

ELT — это функция, возвращающая N-й элемент из списка. В приведённой строке она используется для демонстрации: ELT(9490=9490,1) всегда возвращает 1. В реальной атаке вместо этого может быть сложный подзапрос, который извлекает нужные данные.

CONCAT объединяет строки. Здесь он нужен, чтобы обернуть результат подзапроса в тильды (~). Это помогает атакующему легко найти выведенные данные в сообщении об ошибке, особенно если ошибка содержит другой текст.

Чем опасна такая инъекция?

Успешная SQL-инъекция может привести к:

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

Error-based инъекции особенно опасны, потому что они позволяют получать данные по частям, даже если приложение не выводит результаты запросов. Злоумышленнику достаточно, чтобы сообщения об ошибках отображались или логировались.

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

Основной метод защиты — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому введённые пользователем строки никогда не интерпретируются как SQL-код.

Дополнительные меры:

  • экранирование специальных символов (но это менее надёжно, чем параметризация);
  • ограничение прав пользователя базы данных (принцип наименьших привилегий);
  • отключение вывода ошибок СУБД в production-окружении;
  • использование WAF (Web Application Firewall) для фильтрации подозрительных запросов;
  • регулярное обновление СУБД и фреймворков.

Важно понимать, что SQL-инъекции — одна из самых распространённых уязвимостей веб-приложений. По данным OWASP, она входит в топ-10 критических рисков.

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

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

  1. Проверить, не была ли инъекция успешной (ищите необычные ошибки в логах СУБД).
  2. Убедиться, что все запросы к базе данных используют параметризацию.
  3. Проверить права пользователя базы данных, от имени которого работает приложение.
  4. Обновить CMS и плагины до последних версий.
  5. Рассмотреть установку WAF.

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

Заключение

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

Источники