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

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

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

Разбор синтаксиса

Давайте разберём каждый элемент этой конструкции.

Закрывающие скобки ))

Две закрывающие скобки в начале обычно указывают на то, что инъекция внедряется в существующий SQL-запрос, где уже есть открытые скобки. Например, оригинальный запрос мог выглядеть так: SELECT * FROM users WHERE id = ((1)). Злоумышленник добавляет )), чтобы закрыть имеющиеся скобки и продолжить внедрение.

Оператор AND

Логический оператор AND используется для объединения условий. В контексте инъекции он позволяет добавить новое условие, которое будет выполнено только если предыдущее истинно. Это нужно, чтобы внедряемая функция выполнилась и вызвала ошибку.

Функция EXTRACTVALUE()

EXTRACTVALUE() — это встроенная функция MySQL (до версии 8.0.17), предназначенная для извлечения значения из XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_fragment, XPath_expression).

Однако при неправильном использовании она генерирует ошибку, которая содержит переданные аргументы. Именно это и эксплуатируют злоумышленники: они передают в функцию специально сформированную строку, чтобы в тексте ошибки вернулись данные из базы.

Начиная с MySQL 8.0.17 функция EXTRACTVALUE() помечена как устаревшая и в новых версиях может быть удалена.

Функция CONCAT() и шестнадцатеричный литерал 0x7e

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

Подзапрос SELECT (ELT(2680=2680,1))

Внутренний подзапрос SELECT (ELT(2680=2680,1)) — это демонстрация возможности выполнения произвольных SQL-выражений. Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 2680=2680 — всегда истинное условие, которое возвращает 1, поэтому ELT(1,1) вернёт строку '1'.

В реальной атаке вместо этого подзапроса злоумышленник подставил бы запрос к системным таблицам, например: SELECT version() или SELECT table_name FROM information_schema.tables. Таким образом, в ошибке EXTRACTVALUE вернулась бы версия СУБД или имена таблиц.

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

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

Как работает атака

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

SELECT * FROM articles WHERE id = ((1)) AND EXTRACTVALUE(2680,CONCAT(0x7e,((SELECT (ELT(2680=2680,1)))),0x7e))-- -

СУБД попытается вычислить EXTRACTVALUE(2680, ...). Первый аргумент — число 2680, которое не является корректным XML-документом. Это вызовет ошибку вида:

XPATH syntax error: '~1~'

В сообщении об ошибке появятся данные, которые злоумышленник передал через CONCAT. Если вместо ELT(2680=2680,1) подставить SELECT database(), то в ошибке отобразится имя текущей базы данных.

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

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

  • Утечка конфиденциальных данных: злоумышленник может получить доступ к персональным данным, паролям, платёжной информации.
  • Компрометация всей базы: через information_schema можно узнать структуру БД и затем извлечь любые таблицы.
  • Обход аутентификации: иногда с помощью инъекций можно войти в систему как администратор.
  • Выполнение произвольных команд: в некоторых конфигурациях возможна загрузка файлов или выполнение кода на сервере.

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

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

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

  1. Валидация входных данных: проверяйте, что параметры соответствуют ожидаемому типу (число, email и т.д.).
  2. Экранирование специальных символов: используйте функции экранирования, предоставляемые драйвером БД.
  3. Ограничение прав пользователя БД: веб-приложение должно работать под учётной записью с минимально необходимыми правами.
  4. Регулярное обновление СУБД: в новых версиях MySQL уязвимые функции вроде EXTRACTVALUE удалены или исправлены.
  5. Использование WAF: веб-приложения firewalls могут блокировать подозрительные запросы, содержащие SQL-конструкции.
  6. Логирование и мониторинг: отслеживайте попытки инъекций, чтобы своевременно реагировать.

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

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

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

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

Заключение

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

Источники