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