Что такое SQL-инъекция через EXTRACTVALUE?
Строка вида %")) OR EXTRACTVALUE(3876,CONCAT(0x7e,((SELECT (ELT(3876=3876,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.
EXTRACTVALUE — это встроенная функция MySQL, предназначенная для работы с XML. Она извлекает значение из XML-документа по заданному XPath-выражению. Однако при неправильном использовании она может генерировать ошибки, содержащие переданные в неё данные. Этим и пользуются злоумышленники.
Как работает error-based SQL-инъекция?
Error-based SQL-инъекция — это техника, при которой атакующий заставляет базу данных выдать сообщение об ошибке, содержащее результат выполнения вредоносного SQL-запроса. Это позволяет обойти слепые методы и получить данные напрямую.
В приведённой строке используется функция EXTRACTVALUE с двумя аргументами: первый — произвольное число (3876), второй — результат CONCAT, который объединяет тильды (0x7e) с подзапросом. Подзапрос SELECT (ELT(3876=3876,1)) возвращает 1, так как условие истинно. Однако на практике вместо этого подзапроса внедряется запрос к системным таблицам, например, для получения имени базы данных или хешей паролей.
Когда EXTRACTVALUE получает некорректный XPath (в данном случае строка с тильдами не является валидным XPath), MySQL генерирует ошибку вида: XPATH syntax error: '~результат_подзапроса~'. Эта ошибка возвращается в ответе сервера, и атакующий может прочитать извлечённые данные.
Разбор строки
%"))— часть, которая закрывает предыдущие кавычки и скобки в уязвимом запросе, подготавливая почву для внедрения.OR EXTRACTVALUE(3876,CONCAT(0x7e,((SELECT ...)),0x7e))— внедряемая конструкция. Если исходный запрос был ложным, OR заставляет его выполниться.-- -— комментарий, который отсекает оставшуюся часть оригинального SQL-запроса.
Зачем используется EXTRACTVALUE?
Функция EXTRACTVALUE удобна для атакующих по нескольким причинам:
- Она доступна в MySQL версий до 5.7 (в более новых версиях она удалена).
- При передаче невалидного XPath она возвращает ошибку, содержащую переданную строку.
- Позволяет извлекать данные посимвольно или целыми строками, в зависимости от подзапроса.
Аналогично используется функция UPDATEXML. Обе они относятся к классу функций, генерирующих ошибки с полезной нагрузкой.
Пример эксплуатации
Предположим, есть уязвимый параметр id в URL: http://example.com/product.php?id=1. Запрос в коде может выглядеть так:
SELECT * FROM products WHERE id = '1'
Атакующий подставляет:
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -
В результате MySQL вернёт ошибку: XPATH syntax error: '~имя_базы~'. Так злоумышленник узнаёт имя текущей базы данных.
Как защититься от error-based SQL-инъекций?
Основные меры защиты:
- Использование подготовленных выражений (prepared statements). Это самый надёжный способ, при котором данные не смешиваются с SQL-кодом.
- Экранирование специальных символов. Если подготовленные выражения недоступны, следует тщательно экранировать все пользовательские вводы.
- Отключение вывода ошибок БД на продакшене. Ошибки не должны показываться пользователю, чтобы не раскрывать структуру БД.
- Регулярное обновление СУБД. В MySQL 5.7+ функции EXTRACTVALUE и UPDATEXML удалены, что снижает риск.
- Использование WAF (Web Application Firewall). Многие WAF блокируют известные сигнатуры SQL-инъекций.
Заключение
Строка с EXTRACTVALUE — это не случайный набор символов, а целенаправленная попытка эксплуатации уязвимости. Понимание принципов работы таких инъекций помогает разработчикам и администраторам лучше защищать свои системы. Всегда проверяйте вводимые данные и используйте современные методы защиты.
Комментарии
—Войдите, чтобы оставить комментарий