Что такое EXTRACTVALUE в MySQL?
EXTRACTVALUE — это встроенная функция MySQL, предназначенная для извлечения значения из фрагмента XML-документа с помощью выражения XPath. Синтаксис: EXTRACTVALUE(XML_фрагмент, выражение_XPath). Функция возвращает текст первого узла, соответствующего XPath-выражению. Однако она получила печальную известность в сфере кибербезопасности как инструмент для проведения error-based SQL-инъекций.
Суть атаки заключается в том, что при передаче некорректного XPath-выражения MySQL генерирует ошибку, в тексте которой может содержаться результат выполнения подзапроса. Злоумышленник намеренно вызывает такую ошибку, чтобы извлечь данные из базы.
Пример внедрения через EXTRACTVALUE
Рассмотрим классический пример, который часто встречается в отчётах по безопасности. Предположим, уязвимый параметр передаётся в SQL-запрос следующим образом:
SELECT * FROM users WHERE id = '$id';
Злоумышленник подставляет вместо $id конструкцию:
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))-- -
В результате MySQL пытается вычислить XPath-выражение, которое начинается с символа ~ (0x7e). Это приводит к ошибке вида:
ERROR 1105 (HY000): XPATH syntax error: '~5.7.23~'
В тексте ошибки отображается версия СУБД, что является утечкой информации. Аналогичным образом можно извлечь имена таблиц, столбцов и даже хеши паролей.
Почему это работает?
Функция EXTRACTVALUE при неверном XPath-выражении вызывает ошибку, которая возвращается клиенту. Если приложение не подавляет вывод ошибок СУБД, злоумышленник получает канал для передачи данных. Этот метод относится к классу error-based SQL-инъекций.
Разбор конкретного запроса
В запросе пользователя: %" OR EXTRACTVALUE(4520,CONCAT(0x7e,((SELECT (ELT(4520=4520,1)))),0x7e))-- - — используется аналогичный подход. Здесь ELT(4520=4520,1) возвращает 1, так как условие истинно. Затем CONCAT добавляет тильды, а EXTRACTVALUE с нечисловым XPath вызывает ошибку, содержащую ~1~. Это простейший тест на наличие уязвимости.
Последствия успешной инъекции
- Утечка конфиденциальных данных: логины, пароли, персональные данные пользователей.
- Полный доступ к базе данных, включая возможность изменения или удаления информации.
- Компрометация всего сервера, если СУБД работает с избыточными привилегиями.
- Использование сервера для дальнейших атак на внутреннюю сеть.
Методы защиты
Чтобы предотвратить эксплуатацию EXTRACTVALUE и других функций в SQL-инъекциях, необходимо применять комплекс мер:
- Параметризованные запросы (prepared statements) — самый надёжный способ. Данные передаются отдельно от SQL-кода, и СУБД не интерпретирует их как часть запроса.
- Экранирование специальных символов — используйте функции экранирования, предоставляемые драйвером БД (например,
mysqli_real_escape_string). - Отключение вывода ошибок СУБД — не показывайте пользователю детали ошибок. Логируйте их, но не выводите в браузер.
- Принцип наименьших привилегий — учётная запись приложения должна иметь только необходимые права, без доступа к системным таблицам.
- Регулярное обновление СУБД — в новых версиях MySQL некоторые функции могут быть удалены или изменены, что снижает риск.
- Использование WAF — веб-приложения-экраны могут блокировать подозрительные запросы, содержащие
EXTRACTVALUEили похожие конструкции.
Заключение
Функция EXTRACTVALUE сама по себе не является уязвимостью, но в руках злоумышленника она становится мощным инструментом для извлечения данных через сообщения об ошибках. Разработчикам следует помнить, что безопасность должна быть заложена на этапе проектирования, а не добавлена после обнаружения бреши. Использование параметризованных запросов и отключение детализированных ошибок — минимально необходимые меры для защиты от error-based SQL-инъекций.
Комментарии
—Войдите, чтобы оставить комментарий