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

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

Подобные конструкции часто встречаются в логах веб-серверов, в отчётах систем обнаружения вторжений (IDS) и в базах знаний по кибербезопасности. Понимание их работы помогает разработчикам и администраторам лучше защищать свои приложения.

Разбор конструкции по элементам

Давайте разберём строку на составляющие:

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

Функция EXTRACTVALUE

EXTRACTVALUE(XML_frag, XPath_expr) — встроенная функция MySQL, возвращающая текст из XML-документа по заданному XPath-выражению. Если XPath-выражение содержит недопустимые символы (например, тильду ~), MySQL генерирует ошибку вида «XPATH syntax error: '~...~'». Именно это и используется злоумышленником: в сообщение об ошибке подставляются данные, которые нужно извлечь.

Конструкция CONCAT и ELT

CONCAT(0x7e, ((SELECT (ELT(9848=9848,1)))), 0x7e) формирует строку, которая затем передаётся в XPath. 0x7e — это шестнадцатеричный код символа ~ (тильда). ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае 9848=9848 — всегда истинное условие, поэтому ELT вернёт 1. Это простейший тест: если инъекция сработала, в ошибке появится ~1~.

В реальных атаках вместо 1 подставляются подзапросы, извлекающие имена таблиц, колонок, пароли пользователей и другую конфиденциальную информацию.

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

Error-based — это метод извлечения данных, при котором злоумышленник заставляет базу данных выдать сообщение об ошибке, содержащее полезную нагрузку. В отличие от union-based, где результаты внедряются в обычный вывод, здесь информация «утекает» через текст ошибки.

Пример реального сообщения об ошибке MySQL: XPATH syntax error: '~1~'. Вместо «1» может оказаться, например, хеш пароля администратора.

Для успешной эксплуатации необходимо, чтобы веб-приложение выводило ошибки СУБД пользователю. Если ошибки скрыты, метод не сработает, и атакующий переключится на blind-инъекции (boolean-based или time-based).

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

Последствия успешной error-based SQL-инъекции могут быть катастрофическими:

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

Именно поэтому OWASP регулярно включает SQL-инъекции в топ-10 самых критичных угроз веб-приложений.

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

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

  1. Параметризация запросов: применяйте подготовленные выражения во всех языках программирования (PHP PDO, Java PreparedStatement, Python psycopg2 и т.д.).
  2. Отключение вывода ошибок СУБД: настройте сервер так, чтобы детали ошибок не попадали к пользователю. Логируйте их, но не показывайте.
  3. Валидация и фильтрация ввода: проверяйте типы данных, длины, допустимые символы. Не полагайтесь только на экранирование.
  4. Принцип наименьших привилегий: учётная запись приложения должна иметь только необходимые права к БД (обычно SELECT, INSERT, UPDATE, DELETE для конкретных таблиц).
  5. Регулярные обновления: следите за патчами СУБД и фреймворков.
  6. WAF: веб-прикладной брандмауэр может блокировать известные шаблоны атак, но не заменяет безопасный код.

Частные случаи и эволюция атак

Строка с EXTRACTVALUE — не единственный пример error-based инъекции. Существуют аналогичные техники с функциями UPDATEXML, GTID_SUBSET, JSON_KEYS и другими. Злоумышленники постоянно ищут новые способы вызвать ошибку с полезной нагрузкой.

Начиная с MySQL 5.7, некоторые функции были изменены, но EXTRACTVALUE остаётся рабочим инструментом для демонстрации уязвимостей и в тестах на проникновение.

Заключение

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

Источники