Что такое EXTRACTVALUE и при чём тут SQL-инъекция?
Функция EXTRACTVALUE в MySQL предназначена для извлечения значения из XML-документа по указанному XPath-выражению. Однако злоумышленники часто используют её для проведения error-based SQL-инъекций — атак, при которых данные извлекаются через сообщения об ошибках базы данных. Запрос, который вы видите, является классическим примером такой инъекции.
Строка ' AND EXTRACTVALUE(2845,CONCAT(0x7e,((SELECT (ELT(2845=2845,1)))),0x7e))-- - — это попытка внедрить вредоносный код в SQL-запрос с целью получения информации о базе данных.
Разбор вредоносного запроса
Давайте разберём эту конструкцию по частям, чтобы понять, как она работает.
- ' — закрывающая кавычка, которая завершает строковый литерал в исходном запросе и позволяет внедрить произвольный SQL-код.
- AND — логический оператор, присоединяющий условие к оригинальному запросу.
- EXTRACTVALUE(2845, CONCAT(...)) — вызов функции EXTRACTVALUE. Первый аргумент (2845) — это XML-документ (в данном случае просто число, которое не является корректным XML, что и приводит к ошибке). Второй аргумент — XPath-выражение, формируемое через CONCAT.
- CONCAT(0x7e, ((SELECT (ELT(2845=2845,1)))), 0x7e) — конкатенация символа '~' (0x7e), результата подзапроса и ещё одного '~'.
- SELECT (ELT(2845=2845,1)) — подзапрос, который возвращает 1, если условие 2845=2845 истинно (а это всегда так). ELT — функция, возвращающая N-й элемент из списка; здесь список состоит из одного элемента 1.
- -- - — комментарий, который отсекает оставшуюся часть оригинального запроса.
Когда MySQL выполняет EXTRACTVALUE с некорректным XML и XPath, содержащим специальные символы, он генерирует ошибку, в тексте которой отображается переданное XPath-выражение. Таким образом, злоумышленник может подставить вместо ELT(2845=2845,1) любой другой подзапрос, например, (SELECT version()) или (SELECT user()), и получить результат в сообщении об ошибке.
Как работает error-based инъекция через EXTRACTVALUE
MySQL при вызове EXTRACTVALUE с некорректным XPath возвращает ошибку вида:
XPATH syntax error: '~5.7.23~'
Здесь '~5.7.23~' — это результат выполнения подзапроса, обёрнутый в тильды. Именно так злоумышленник узнаёт версию СУБД, имя пользователя, название базы данных и другие сведения. В приведённом примере подзапрос возвращает 1, но его можно заменить на любой другой, например:
' AND EXTRACTVALUE(2845,CONCAT(0x7e,(SELECT version()),0x7e))-- -
В ответе придёт ошибка с версией MySQL. Аналогично можно извлекать имена таблиц, столбцов и даже хеши паролей, если позволяет привилегия.
Почему это опасно?
Error-based SQL-инъекции позволяют злоумышленнику получать данные напрямую из базы, не имея легитимного доступа. Это может привести к утечке конфиденциальной информации, компрометации учётных записей и полному захвату сервера. Особенно опасны такие атаки для сайтов, где пользовательский ввод не фильтруется и попадает в SQL-запросы без параметризации.
Как защититься от SQL-инъекций через EXTRACTVALUE
Основной метод защиты — использование подготовленных выражений (prepared statements) с параметризацией. Это исключает возможность внедрения произвольного SQL-кода. Дополнительные меры:
- Валидация и фильтрация всех входных данных на стороне сервера.
- Ограничение прав пользователя базы данных: не давайте приложению прав на чтение системных таблиц и выполнение опасных функций.
- Регулярное обновление СУБД и фреймворков для закрытия известных уязвимостей.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
- Отключение отображения подробных ошибок БД в production-окружении, чтобы злоумышленник не мог получить данные через сообщения об ошибках.
Пример безопасного кода на PHP
Вместо конкатенации строк используйте PDO с подготовленными выражениями:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $userId]);
Такой подход гарантирует, что пользовательский ввод не будет интерпретирован как SQL-код.
Заключение
Запрос ' AND EXTRACTVALUE(2845,CONCAT(0x7e,((SELECT (ELT(2845=2845,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Понимание механики таких атак помогает разработчикам и администраторам баз данных своевременно закрывать уязвимости. Помните: лучшая защита — это параметризованные запросы и минимальные привилегии для пользователей БД.
Комментарии
—Войдите, чтобы оставить комментарий