Что такое EXTRACTVALUE SQL-инъекция

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

В основе лежит особенность MySQL: функция EXTRACTVALUE генерирует ошибку, если второй аргумент содержит некорректный XPath-выражение. Злоумышленник намеренно подставляет туда результат подзапроса, чтобы сервер вернул его в тексте ошибки.

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

Рассмотрим каждый элемент детально:

  • )))) — закрывающие скобки, которые завершают предыдущие части оригинального SQL-запроса. Это нужно, чтобы внедряемая конструкция стала синтаксически корректной.
  • AND EXTRACTVALUE(4577, CONCAT(...)) — добавляет условие, которое всегда ложно (или истинно в зависимости от контекста), но главное — вызывает функцию EXTRACTVALUE с заведомо ошибочным XPath.
  • 4577 — произвольное число, первый аргумент функции. Обычно это XML-документ, но здесь используется просто число для упрощения.
  • CONCAT(0x7e, ((SELECT (ELT(4577=4577,1)))), 0x7e) — формирует строку, которая передаётся как XPath. Символ 0x7e — это тильда ~. Она используется как разделитель, чтобы облегчить поиск вывода в сообщении об ошибке.
  • SELECT (ELT(4577=4577,1)) — подзапрос, который возвращает результат. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь условие 4577=4577 всегда истинно, поэтому ELT возвращает первую строку — 1. В реальной атаке вместо этого подзапроса внедряют извлечение данных, например, SELECT version() или SELECT password FROM users.
  • -- - — комментарий, который обрезает оставшуюся часть оригинального запроса, чтобы избежать синтаксических ошибок.

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

MySQL при вызове EXTRACTVALUE(4577, '~1~') попытается интерпретировать второй аргумент как XPath. Строка '~1~' не является валидным XPath, поэтому СУБД сгенерирует ошибку вида: XPATH syntax error: '~1~'. Злоумышленник, видя эту ошибку в ответе сервера, получает данные, которые были подставлены в XPath. В нашем примере это число 1, но в реальной атаке там могут быть имена таблиц, хэши паролей и другая конфиденциальная информация.

Таким образом, error-based SQL-инъекция позволяет извлекать данные посимвольно или целыми строками, если приложение выводит сообщения об ошибках базы данных.

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

CONCAT объединяет несколько строк в одну. В нашем случае он склеивает тильду, результат подзапроса и ещё одну тильду. Это делается для того, чтобы чётко отделить выводимые данные от остального текста ошибки. Тильда выбрана как символ, который редко встречается в обычных данных.

ELT — это функция, возвращающая N-й элемент из списка. В простейшем случае ELT(4577=4577,1) возвращает 1, так как условие истинно. В более сложных атаках ELT может использоваться для извлечения конкретных полей из базы, например: ELT(1, (SELECT table_name FROM information_schema.tables LIMIT 1)).

Цели и последствия атаки

Основная цель error-based SQL-инъекции — получить доступ к данным, которые не должны быть видны пользователю. Это могут быть:

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

Успешная эксплуатация уязвимости может привести к полной компрометации базы данных, утечке конфиденциальной информации и финансовым потерям.

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

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

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

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

Пример безопасного кода

Вместо конкатенации строк используйте подготовленные выражения. Например, на PHP с PDO:

$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $userId]);

Такой подход гарантирует, что пользовательский ввод не повлияет на структуру SQL-запроса.

Заключение

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

Источники