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