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