Что такое SQL-инъекция через EXTRACTVALUE?
SQL-инъекция — один из самых распространённых способов атаки на веб-приложения, при котором злоумышленник внедряет вредоносный SQL-код в запросы к базе данных. Error-based SQL-инъекция — это техника, при которой атакующий заставляет СУБД выдать сообщение об ошибке, содержащее извлекаемые данные. Функция EXTRACTVALUE в MySQL часто используется именно для этого.
Рассматриваемый запрос: %")))) AND EXTRACTVALUE(2560,CONCAT(0x7e,((SELECT (ELT(2560=2560,1)))),0x7e))-- - — типичный пример error-based инъекции. Давайте разберём его по частям.
Синтаксис и назначение EXTRACTVALUE
Функция EXTRACTVALUE предназначена для извлечения значения из XML-документа по заданному XPath-выражению. Она принимает два аргумента: XML-строку и XPath-выражение. Если XPath возвращает не текстовый узел, а, например, несколько узлов или недопустимый символ, MySQL генерирует ошибку с указанием проблемного фрагмента. Именно эту особенность эксплуатируют злоумышленники.
В легитимном коде EXTRACTVALUE используется редко, но в контексте атак она стала классическим инструментом для извлечения данных через ошибки.
Разбор вредоносного запроса
Строка %")))) AND EXTRACTVALUE(2560,CONCAT(0x7e,((SELECT (ELT(2560=2560,1)))),0x7e))-- - состоит из нескольких частей:
- %")))) — попытка закрыть предыдущие кавычки и скобки, чтобы внедрить свой код в существующий SQL-запрос.
- AND EXTRACTVALUE(...) — добавляет условие, которое всегда истинно (AND с функцией), но при этом вызывает ошибку.
- 2560 — произвольное число, первый аргумент EXTRACTVALUE (XML-документ). Поскольку это не XML, функция сразу попытается его обработать.
- CONCAT(0x7e, ((SELECT (ELT(2560=2560,1)))), 0x7e) — конкатенация тильды (0x7e — символ ~), результата подзапроса и ещё одной тильды. ELT(2560=2560,1) возвращает 1, так как условие истинно. Подзапрос может быть заменён на любой другой, например, для извлечения имени пользователя или пароля.
- -- - — комментарий, обрезающий остаток оригинального запроса.
В результате MySQL попытается выполнить EXTRACTVALUE с не-XML аргументом и выдаст ошибку вида: XPATH syntax error: '~1~'. В реальной атаке вместо 1 подставляется результат подзапроса, например, версия СУБД, имя базы данных или хеш пароля.
Как работает ELT и CONCAT в этом запросе
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(2560=2560,1) вернёт 1, потому что условие 2560=2560 истинно (равно 1). Это простейший пример, но вместо 1 может быть любой подзапрос, например: (SELECT password FROM users LIMIT 1).
CONCAT объединяет символ ~ (0x7e), результат подзапроса и ещё один ~. Тильды нужны, чтобы отделить данные в сообщении об ошибке и облегчить их извлечение.
Последствия успешной инъекции
Если приложение уязвимо, злоумышленник может:
- Получить версию MySQL, имя текущей базы данных, имя пользователя.
- Извлечь таблицы, столбцы и их содержимое (например, логины и пароли).
- При достаточных привилегиях — читать и записывать файлы на сервере, выполнять команды ОС.
Error-based инъекции особенно опасны, потому что не требуют слепого перебора и дают быстрый результат.
Как защититься от SQL-инъекций
Основной метод — использование параметризованных запросов (prepared statements). Они разделяют код SQL и данные, поэтому внедрение команд невозможно.
Никогда не конкатенируйте пользовательский ввод в SQL-запросы. Даже если вы используете экранирование, всегда есть риск обойти его.
Дополнительные меры:
- Валидация и фильтрация всех входных данных.
- Ограничение прав пользователя базы данных (только необходимые привилегии).
- Использование ORM и современных фреймворков, которые по умолчанию применяют параметризацию.
- Регулярное обновление СУБД и веб-приложений.
- Внедрение WAF (Web Application Firewall) для блокировки подозрительных запросов.
В частности, функция EXTRACTVALUE не должна использоваться с пользовательским вводом. Если она необходима, убедитесь, что аргументы строго контролируются.
Заключение
Запрос %")))) AND EXTRACTVALUE(2560,CONCAT(0x7e,((SELECT (ELT(2560=2560,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Понимание таких атак помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Помните: безопасность — это процесс, а не одноразовое действие.
Комментарии
—Войдите, чтобы оставить комментарий