Что такое ExtractValue и при чём тут SQL-инъекция
ExtractValue — это встроенная функция MySQL, предназначенная для извлечения значения из XML-строки по указанному XPath-выражению. Изначально она создавалась для работы с XML-данными, но получила печальную известность в среде информационной безопасности: злоумышленники научились использовать её для проведения так называемых error-based SQL-инъекций. Суть метода в том, что при передаче некорректного XPath-выражения MySQL возвращает сообщение об ошибке, в котором содержится результат выполнения вложенного подзапроса. Так через ошибку можно «вытащить» данные из базы.
Запрос из вашего вопроса — классический пример такой атаки: %"))) AND EXTRACTVALUE(7165,CONCAT(0x7e,((SELECT (ELT(7165=7165,1)))),0x7e))-- -. Давайте разберём его по частям.
Анатомия вредоносного запроса
Строка %"))) — это попытка закрыть исходный SQL-запрос, который, вероятно, выглядел как SELECT ... WHERE id = '%")))'. Символы "))) ломают синтаксис, а % в начале — это URL-кодирование, часто применяемое для обхода простых фильтров. Далее следует AND EXTRACTVALUE(7165,CONCAT(...)). Первый аргумент (7165) — произвольное число, второй — XML-фрагмент, собранный функцией CONCAT.
Внутри CONCAT используется 0x7e — это шестнадцатеричное представление символа «~» (тильда). Тильда служит маркером, чтобы отделить полезную нагрузку от служебных символов в сообщении об ошибке. Центральный элемент — подзапрос SELECT (ELT(7165=7165,1)). Функция ELT возвращает N-й элемент из списка; здесь условие 7165=7165 всегда истинно (1), поэтому ELT(1,1) вернёт «1». В реальной атаке вместо этого примитивного выражения подставляется подзапрос, извлекающий имя пользователя, название таблицы или хеш пароля.
Завершающая часть -- - — это комментарий, который «отрезает» остаток оригинального SQL-запроса, чтобы он не вызвал синтаксическую ошибку.
Как работает error-based инъекция через ExtractValue
MySQL при вызове ExtractValue с некорректным XPath генерирует ошибку вида: XPATH syntax error: '~результат~'. Злоумышленник конструирует XPath так, чтобы в тексте ошибки оказались данные из базы. Например, запрос:
AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))
вызовет ошибку, в которой будет указана версия MySQL. Аналогично можно получить имя текущей базы данных, список таблиц, столбцов и даже содержимое записей. Поскольку сообщение об ошибке отображается на странице (если включён вывод ошибок), атакующий видит результат.
В более сложных случаях используются функции ELT, UPDATEXML, EXP, FLOOR(RAND(0)*2) — все они служат одной цели: заставить СУБД вернуть данные в тексте ошибки.
Чем опасна такая инъекция
Последствия успешной эксплуатации могут быть катастрофическими:
- Утечка конфиденциальных данных — логины, пароли, персональные данные пользователей, платёжная информация.
- Компрометация всей базы — через error-based инъекцию можно перебрать все таблицы и извлечь их содержимое.
- Обход аутентификации — манипулируя условиями WHERE, злоумышленник может войти в систему под администратором.
- Отказ в обслуживании — некоторые конструкции вызывают ресурсоёмкие вычисления, нагружая сервер.
Особенно опасна комбинация с другими уязвимостями, например, с возможностью записи файлов через SQL.
Как защититься от инъекций через ExtractValue
Главное правило — никогда не доверять пользовательскому вводу. Вот ключевые меры:
- Параметризованные запросы (prepared statements) — самый надёжный способ. Данные передаются отдельно от SQL-кода, и функции вроде ExtractValue не могут быть внедрены.
- Экранирование спецсимволов — используйте встроенные функции драйвера БД (например, mysqli_real_escape_string в PHP). Но это менее надёжно, чем параметризация.
- Отключение вывода ошибок СУБД на продакшене — если сообщения об ошибках не показываются пользователю, error-based инъекция теряет смысл.
- Ограничение прав пользователя БД — учётная запись веб-приложения должна иметь минимум привилегий (только SELECT/INSERT/UPDATE для нужных таблиц).
- Регулярное обновление MySQL — в новых версиях некоторые функции ограничены, а поведение ошибок изменено.
- Использование WAF — веб-приложения-фильтры могут блокировать подозрительные конструкции, но не заменяют правильного кодирования.
Также рекомендуется проводить аудит кода и пентесты, чтобы выявить уязвимости до того, как их найдут злоумышленники.
Заключение
Запрос %"))) AND EXTRACTVALUE(7165,CONCAT(0x7e,((SELECT (ELT(7165=7165,1)))),0x7e))-- - — это не безобидный набор символов, а рабочий инструмент хакера для кражи данных. Понимание механики таких атак помогает разработчикам и администраторам своевременно закрывать уязвимости. Помните: безопасность — это процесс, а не разовое действие.
Комментарии
—Войдите, чтобы оставить комментарий