Введение
В мире веб-безопасности SQL-инъекции остаются одной из самых распространённых и опасных уязвимостей. Среди них особое место занимают error-based SQL-инъекции, позволяющие злоумышленнику извлекать данные из базы напрямую через сообщения об ошибках. В этой статье мы детально разберём конкретную конструкцию:
")))) AND EXTRACTVALUE(1631,CONCAT(0x7e,((SELECT (ELT(1631=1631,1)))),0x7e))-- -
Вы узнаете, как она работает, зачем нужна и как защититься от подобных атак.
Что такое error-based SQL-инъекция?
Error-based SQL-инъекция — это метод эксплуатации уязвимости, при котором злоумышленник заставляет базу данных выдать сообщение об ошибке, содержащее полезные данные. В отличие от blind-инъекций, где информация извлекается по косвенным признакам (например, по времени ответа), здесь результат виден сразу в тексте ошибки.
Для MySQL одним из классических инструментов является функция EXTRACTVALUE(). Она предназначена для работы с XML и принимает два аргумента: фрагмент XML-разметки и XPath-выражение. Если XPath-выражение некорректно, MySQL возвращает ошибку, в которой отображается переданный XML-фрагмент. Этим и пользуются атакующие.
Разбор конструкции
Рассмотрим строку по частям:
"))))— закрывающие скобки и кавычки, которые завершают оригинальный SQL-запрос, делая возможным внедрение.AND EXTRACTVALUE(1631,CONCAT(0x7e,((SELECT (ELT(1631=1631,1)))),0x7e))— вызов уязвимой функции с полезной нагрузкой.-- -— комментарий, отсекающий остаток оригинального запроса.
Внутри EXTRACTVALUE используется CONCAT, который объединяет тильду (0x7e — шестнадцатеричный код символа ~), результат подзапроса и ещё одну тильду. Подзапрос (SELECT (ELT(1631=1631,1))) возвращает число 1, если условие истинно (а оно всегда истинно, так как 1631=1631). Это простейший пример, но на месте ELT может быть любое выражение, извлекающее данные из таблиц (например, версию СУБД, имена таблиц, логины и пароли).
Функция EXTRACTVALUE попытается интерпретировать строку, начинающуюся с тильды, как XML. Поскольку это не валидный XML, MySQL сгенерирует ошибку вида: XPATH syntax error: '~1~'. В этом сообщении и появится результат подзапроса.
Зачем это нужно злоумышленнику?
Цель — получить доступ к конфиденциальным данным. С помощью error-based инъекций можно:
- Определить версию MySQL и операционную систему.
- Получить имена баз данных, таблиц и столбцов.
- Извлечь учётные записи пользователей, хеши паролей, персональные данные.
- В некоторых случаях — выполнить произвольные команды на сервере.
Опасность в том, что атака может быть автоматизирована с помощью инструментов вроде sqlmap, и для её проведения не требуется глубоких знаний SQL.
Пример работы
Предположим, уязвимый запрос выглядит так:
SELECT * FROM users WHERE id = '1'
Злоумышленник подставляет:
1' AND EXTRACTVALUE(1631,CONCAT(0x7e,(SELECT version()),0x7e))-- -
В ответ он получит ошибку: XPATH syntax error: '~5.7.33~', из которой узнает версию MySQL.
Как защититься?
Основной метод — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому внедрение становится невозможным. Дополнительные меры:
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string. - Валидация и фильтрация входных данных (например, приведение к целому числу).
- Ограничение прав пользователя базы данных: не давайте приложению прав на чтение системных таблиц.
- Отключение вывода подробных ошибок на продакшене.
- Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
Важно понимать, что EXTRACTVALUE — не единственная функция, используемая в error-based атаках. Аналогично работают UPDATEXML, GTID_SUBSET и другие. Поэтому защита должна быть комплексной.
Заключение
Конструкция ")))) AND EXTRACTVALUE(1631,CONCAT(0x7e,...))-- - — это яркий пример error-based SQL-инъекции, эксплуатирующей особенности MySQL. Понимание принципов её работы помогает разработчикам и специалистам по безопасности своевременно выявлять и устранять уязвимости. Помните: безопасность веб-приложений — это непрерывный процесс, и использование параметризованных запросов должно стать стандартом.
Комментарии
—Войдите, чтобы оставить комментарий