Что это за строка?
Строка ) AND EXTRACTVALUE(1702,CONCAT(0x7e,((SELECT (ELT(1702=1702,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в учебных материалах по пентесту и в отчётах сканеров уязвимостей.
Главная цель — заставить сервер базы данных вернуть в тексте ошибки результат выполнения вложенного SQL-запроса. В данном случае это тривиальный запрос SELECT 1, но на его месте может быть, например, SELECT password FROM users LIMIT 1.
Разбор по частям
1. Закрывающая скобка и AND
Начинается строка с ) — это закрывающая скобка, которая «завершает» ранее открытую скобку в уязвимом запросе. Например, если приложение выполняет что-то вроде SELECT * FROM articles WHERE id = (1, то наша инъекция добавит ) и закроет её. Далее идёт AND — логический оператор, который позволяет присоединить дополнительное условие.
2. Функция EXTRACTVALUE
EXTRACTVALUE(XML, XPath) — функция MySQL для извлечения значения из XML-документа по заданному XPath-выражению. Если XPath некорректен, MySQL генерирует ошибку, в тексте которой отображается переданный фрагмент. Именно это и используется для вывода данных.
В нашем случае первый аргумент — число 1702. Оно не является валидным XML, что уже провоцирует ошибку, но главное — второй аргумент.
3. CONCAT и тильда (0x7e)
CONCAT(0x7e, ..., 0x7e) склеивает строки. 0x7e — это шестнадцатеричный код символа ~ (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке легко найти начало и конец выводимых данных. Например, ошибка может выглядеть так: XPATH syntax error: '~1~'.
4. Подзапрос с ELT
((SELECT (ELT(1702=1702,1)))) — это вложенный запрос, который возвращает значение. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 1702=1702 — всегда истина (1), поэтому ELT(1, 1) вернёт 1. В учебном примере это просто заглушка. В реальной атаке вместо 1 подставляют конкатенацию полей, например CONCAT(login, 0x3a, password).
5. Комментарий -- -
Два дефиса и пробел (или -- -) — это комментарий в SQL. Всё, что идёт после него, игнорируется базой данных. Это нужно, чтобы «отрезать» остаток оригинального запроса, который мог бы вызвать синтаксическую ошибку.
Как это работает на практике
Предположим, уязвимый запрос выглядит так:
SELECT * FROM news WHERE id = (1)
После подстановки нашей строки получается:
SELECT * FROM news WHERE id = (1) AND EXTRACTVALUE(1702,CONCAT(0x7e,((SELECT (ELT(1702=1702,1)))),0x7e))-- -)
MySQL выполняет:
- Закрывает скобку после
1. - Добавляет условие
AND EXTRACTVALUE(...). - Внутри
EXTRACTVALUEпытается разобрать XPath, начинающийся с~1~. Это некорректный XPath, поэтому возникает ошибка. - В тексте ошибки возвращается
XPATH syntax error: '~1~'. - Всё после
-- -игнорируется.
Атакующий видит в ответе сервера сообщение об ошибке и понимает, что инъекция сработала. Если вместо 1 подставить подзапрос, возвращающий конфиденциальные данные, они также попадут в ошибку.
Зачем это нужно злоумышленникам?
Error-based инъекции — один из самых быстрых способов извлечения информации из базы, когда приложение не выводит данные напрямую, но отображает ошибки СУБД. С помощью EXTRACTVALUE или аналогичной UPDATEXML можно посимвольно вытащить имена таблиц, столбцов, логины и пароли. Скорость зависит от количества запросов, но часто это десятки-сотни обращений.
Меры защиты
Чтобы подобные строки не попали в SQL-запрос, необходимо:
- Использовать подготовленные выражения (prepared statements) с параметризацией. Это самый надёжный способ.
- Экранировать специальные символы при невозможности использовать параметризацию (например, через
mysqli_real_escape_string). - Отключить вывод ошибок СУБД на продакшене — это усложнит эксплуатацию error-based инъекций.
- Применять WAF (Web Application Firewall) для фильтрации подозрительных конструкций.
- Регулярно проводить аудит кода и сканирование уязвимостей.
Важно понимать: даже если приложение не выводит ошибки, существуют blind-инъекции, поэтому защита должна быть комплексной.
Является ли это вредоносным?
Сама по себе строка — это лишь фрагмент кода. Она не является вирусом или программой. Это инструмент, который может быть использован как во благо (тестирование на проникновение с разрешения владельца), так и во вред. Публикация таких примеров в образовательных целях помогает разработчикам понять механизмы атак и лучше защищать свои системы.
Заключение
Разобранная конструкция — типичный пример error-based SQL-инъекции через функцию EXTRACTVALUE. Она демонстрирует, как недостаточная фильтрация входных данных и вывод ошибок БД могут привести к утечке информации. Понимание принципов работы таких атак — первый шаг к построению безопасных веб-приложений.
Комментарии
—Войдите, чтобы оставить комментарий