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

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

Как работает эта инъекция?

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

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

При выполнении EXTRACTVALUE с аргументом, не являющимся корректным XML, MySQL генерирует ошибку вида: XPATH syntax error: '~1~'. Именно эта ошибка и возвращается атакующему, позволяя прочитать внедрённые данные.

Зачем это нужно злоумышленнику?

Error-based SQL-инъекции — один из самых быстрых способов извлечения информации из базы данных. В отличие от слепых (blind) инъекций, где приходится задавать множество запросов и анализировать логические условия, здесь результат приходит непосредственно в тексте ошибки. Это позволяет за один запрос получить целую строку данных.

Типичные цели атак:

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

Функция EXTRACTVALUE в MySQL

EXTRACTVALUE() принимает два строковых аргумента: фрагмент XML-разметки и XPath-выражение (локатор). Она возвращает текст (CDATA) первого текстового узла, который является дочерним для элемента или элементов, соответствующих XPath-выражению. Если XML-фрагмент некорректен, функция выдаёт ошибку. Эту особенность и эксплуатируют злоумышленники.

Аналогичным образом может использоваться функция UPDATEXML(), которая также генерирует ошибку при неправильном XPath.

Пример реальной атаки

Предположим, на сайте есть уязвимый параметр id, который подставляется в SQL-запрос без экранирования:

SELECT * FROM products WHERE id = $id

Если передать id = 1) AND EXTRACTVALUE(6376,CONCAT(0x7e,((SELECT (ELT(6376=6376,1)))),0x7e))-- -, то итоговый запрос станет:

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

Вместо 1 в подзапрос можно вставить, например, (SELECT version()), и в ошибке отобразится версия MySQL.

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

Основные меры предотвращения error-based SQL-инъекций:

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

Заключение

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

Источники