Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье я расскажу, как нашел интересную уязвимость во время bug bounty. Случай распространенный: недостаточное экранирование входных параметров. Началось все с того, что я подметил ошибку 500 при генерации PDF на сайте. Я заинтересовался проблемой, и постепенно она привела меня к RCE. Давай разберем всю атаку по шагам.
Это исследование получило третье место на Pentest Award 2025 в категории «Пробив WEB». Соревнование ежегодно проводится компанией Awillix.
Итак, сайт выдавал «внутреннюю ошибку сервера» (500) при попытке сгенерировать PDF, если в запросе оказывался символ переноса (%0d
).
Другие спецсимволы на результат никак не влияли.
За формирование PDF на основе другого PDF-файла отвечал вот этот метод API со скриншота ниже. Он записывал информацию из полученного параметра в метаданные EXIF.
Для записи метаданных разработчики решили использовать популярную тулзу ExifTool.
Методом проб и ошибок я обнаружил, что можно передавать произвольные аргументы в ExifTool через символ переноса строки.
Пример с аргументом description
Эта уязвимость связана со специальным режимом работы ExifTool, сделанным для повышения производительности при пакетной обработке файлов. Очередной пример того, что погоня за производительностью может создавать проблемы безопасности! В этом режиме ExifTool остается запущенным между сессиями обработки разных файлов, а параметры для обработки принимает из стандартного ввода — каждый параметр на новой строке.
Позже я нашел используемую уязвимую библиотеку — это go-exiftool, проблему можешь увидеть в строке 246 ее исходника. Связаться с автором библиотеки для уведомления о проблеме мне не удалось.
Но вернемся к уязвимости. Чего можно добиться с помощью инъекции произвольных параметров в ExifTool? После чтения документации я понял, что можно:
-TAG<=DATFILE
; -W[+|!] FMT
; -if EXPR
. К сожалению, в этом месте начались проблемы, поскольку символы вроде <
, +
или !
экранировались, и единственное, что удалось получить, — это слепое выполнение кода (пример будет дальше).
Чтобы полноценно поэксплуатировать все возможные векторы, хотелось найти какой‑то байпас. В API приложения был еще один метод, который генерирует PDF из DOCX и добавляет EXIF-метаинформацию из заголовка этого документа. Поскольку формат DOCX — это просто архив ZIP с набором XML-файлов, можно попробовать использовать полезные нагрузки с предыдущего этапа. Например, файл docProps/core.xml
содержит информацию о документе и в нем можно поменять заголовок. Пример полезной нагрузки для чтения файла:
test -description<=/etc/passwd
С таким пейлоадом содержимое файла вернется в теге -description
в документе.
Так мне удалось обойти экранирование спецсимволов.
Но есть еще одна проблема — в случае с выполнением кода результат выполнения команды никуда не возвращается (а в тестируемом сервисе не было доступа в интернет, поэтому ответ было невозможно куда‑то отправить). Возникла идея вернуть результат выполнения в значение какого‑нибудь тега, который потом прилетит в PDF-документе.
Источник: xakep.ru