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

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

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

  • ) — закрывающая скобка, которая завершает предыдущее выражение в уязвимом SQL-запросе. Она нужна, чтобы синтаксис стал корректным после подстановки вредоносного кода.
  • OR — логический оператор, который позволяет внедрить условие, не нарушая общую логику запроса (например, для обхода аутентификации).
  • EXTRACTVALUE(9116, CONCAT(0x7e, ((SELECT (ELT(9116=9116,1)))), 0x7e)) — вызов функции EXTRACTVALUE, которая извлекает значение из XML-фрагмента по заданному XPath-выражению. Первый аргумент — произвольное число (здесь 9116), второй — XPath-выражение, сформированное динамически.
  • CONCAT(0x7e, ..., 0x7e) — конкатенация символа ~ (код 0x7e) с результатом подзапроса. Символ ~ используется как разделитель, чтобы облегчить поиск данных в сообщении об ошибке.
  • SELECT (ELT(9116=9116,1)) — подзапрос, возвращающий 1, если условие 9116=9116 истинно. Функция ELT возвращает N-й элемент из списка; здесь список состоит из одного элемента — 1. Это простейшая проверка, которая всегда возвращает 1.
  • -- - — комментарий, который отсекает оставшуюся часть оригинального SQL-запроса, чтобы не возникло синтаксической ошибки.

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

Функция EXTRACTVALUE в MySQL предназначена для работы с XML и требует, чтобы второй аргумент был корректным XPath-выражением. Если XPath содержит недопустимые символы (например, ~), MySQL генерирует ошибку вида XPATH syntax error: '~...~'. Злоумышленник конструирует XPath так, чтобы в текст ошибки попало значение, полученное из подзапроса. Таким образом, вместо прямого вывода данных на страницу, информация извлекается через сообщение об ошибке.

Пример ошибки: XPATH syntax error: '~1~' — здесь «1» и есть результат выполнения подзапроса.

В реальных атаках вместо ELT(9116=9116,1) подставляются подзапросы, извлекающие имена таблиц, столбцов, логины и пароли пользователей. Например, (SELECT version()) вернёт версию MySQL, (SELECT database()) — имя текущей базы данных.

Зачем нужны числа 9116 и 0x7e?

Число 9116 — произвольный идентификатор, который не несёт смысловой нагрузки. Он может быть любым, главное — чтобы функция EXTRACTVALUE получила два аргумента. Символ 0x7e — это шестнадцатеричное представление тильды (~). Тильда выбрана потому, что редко встречается в обычных данных и легко находится в тексте ошибки. Иногда вместо неё используют 0x3a (двоеточие) или другие символы.

Опасность и последствия

Успешная error-based SQL-инъекция позволяет злоумышленнику:

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

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

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

Основной способ предотвращения — использование параметризованных запросов (prepared statements). В этом случае вредоносный код не может изменить структуру SQL-запроса. Дополнительные меры:

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

Заключение

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

Источники