Что такое EXTRACTVALUE?
EXTRACTVALUE — это встроенная функция в СУБД MySQL, предназначенная для извлечения значений из XML-документов с помощью выражений XPath. Синтаксис функции: EXTRACTVALUE(XML_document, XPath_expression). Она возвращает текст первого узла, соответствующего указанному XPath-выражению. Однако эта функция также известна как инструмент для проведения error-based SQL-инъекций, поскольку при некорректном XPath-выражении MySQL генерирует ошибку, содержащую результат вычисления переданного выражения.
Как работает error-based SQL-инъекция через EXTRACTVALUE?
Классический пример, подобный запросу )))) AND EXTRACTVALUE(4993,CONCAT(0x7e,((SELECT (ELT(4993=4993,1)))),0x7e))-- -, демонстрирует технику извлечения данных через сообщения об ошибках. Давайте разберём по частям:
))))— закрывающие скобки, которые завершают предыдущие выражения в исходном SQL-запросе, чтобы внедрить свой код.AND EXTRACTVALUE(...)— логическое условие, которое выполняется, если предыдущая часть запроса истинна.4993— произвольное число, используемое как XML-документ (фактически не является валидным XML, что и вызывает ошибку).CONCAT(0x7e, ((SELECT (ELT(4993=4993,1)))), 0x7e)— конкатенация тильды (~, код 0x7e), результата подзапроса и ещё одной тильды. ПодзапросSELECT (ELT(4993=4993,1))возвращает 1, если условие4993=4993истинно (а это всегда так). ELT — функция, возвращающая N-й элемент из списка; здесь список состоит из одного элемента — 1.-- -— комментарий, обрезающий остаток оригинального запроса.
В результате MySQL пытается интерпретировать строку вида ~1~ как XPath-выражение, терпит неудачу и возвращает ошибку: XPATH syntax error: '~1~'. Злоумышленник видит эту ошибку и понимает, что инъекция успешна, а также может извлекать данные, подставляя вместо 1 другие выражения, например, имена таблиц или хеши паролей.
Зачем это нужно злоумышленникам?
Error-based SQL-инъекции через EXTRACTVALUE (и аналогичную функцию UPDATEXML) позволяют атакующему получать информацию из базы данных, даже если приложение не выводит результаты запроса напрямую. Ошибки СУБД часто отображаются в ответе сервера, что даёт возможность пошагово извлекать структуру БД, таблицы, поля и содержимое. Это один из самых быстрых способов эксплуатации SQL-инъекций, так как не требует слепого перебора.
Пример эксплуатации
Предположим, есть уязвимый параметр id в URL: ?id=1. Злоумышленник может отправить:
?id=1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))В ответе сервера появится ошибка с именем текущей базы данных. Аналогично можно извлечь версию MySQL, имена таблиц и т.д.
Как защититься?
Основной метод защиты — использование параметризованных запросов (prepared statements). Никогда не конкатенируйте пользовательский ввод в SQL-запросы. Также рекомендуется:
- Применять ORM (например, Hibernate, Entity Framework).
- Экранировать специальные символы, если параметризация невозможна.
- Ограничить права пользователя БД, чтобы даже при инъекции нельзя было прочитать лишние данные.
- Отключить вывод подробных ошибок СУБД в production-окружении.
- Использовать WAF (Web Application Firewall) для фильтрации подозрительных запросов.
Важно: функции EXTRACTVALUE и UPDATEXML не следует использовать для обработки пользовательского ввода. Они предназначены для работы с XML и не являются безопасными в контексте SQL-запросов.
Заключение
Конструкция )))) AND EXTRACTVALUE(4993,CONCAT(0x7e,((SELECT (ELT(4993=4993,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции, использующей особенность MySQL генерировать ошибки с полезной нагрузкой. Понимание механизма таких атак помогает разработчикам и специалистам по безопасности своевременно выявлять и устранять уязвимости.
Комментарии
—Войдите, чтобы оставить комментарий