Содержание статьи
Это исследование получило третье место на Pentest Award 2025 в категории «Пробив WEB». Соревнование ежегодно проводится компанией Awillix.
Итак, сайт выдавал «внутреннюю ошибку сервера» (500) при попытке сгенерировать PDF, если в запросе оказывался символ переноса (%0d
).

Другие спецсимволы на результат никак не влияли.
За формирование PDF на основе другого PDF-файла отвечал вот этот метод API со скриншота ниже. Он записывал информацию из полученного параметра в метаданные EXIF.

Для записи метаданных разработчики решили использовать популярную тулзу ExifTool.
Методом проб и ошибок я обнаружил, что можно передавать произвольные аргументы в ExifTool через символ переноса строки.

Эта уязвимость связана со специальным режимом работы ExifTool, сделанным для повышения производительности при пакетной обработке файлов. Очередной пример того, что погоня за производительностью может создавать проблемы безопасности! В этом режиме ExifTool остается запущенным между сессиями обработки разных файлов, а параметры для обработки принимает из стандартного ввода — каждый параметр на новой строке.
Позже я нашел используемую уязвимую библиотеку — это go-exiftool, проблему можешь увидеть в строке 246 ее исходника. Связаться с автором библиотеки для уведомления о проблеме мне не удалось.
Но вернемся к уязвимости. Чего можно добиться с помощью инъекции произвольных параметров в ExifTool? После чтения документации я понял, что можно:
- читать файлы с помощью параметров
-TAG<
;=DATFILE - писать файлы (с некоторыми ограничениями) с помощью параметров
-W[
;+|!] FMT - исполнять произвольный код с помощью
-if
.EXPR
К сожалению, в этом месте начались проблемы, поскольку символы вроде <
, +
или !
экранировались, и единственное, что удалось получить, — это слепое выполнение кода (пример будет дальше).
Продвигаемся
Чтобы полноценно поэксплуатировать все возможные векторы, хотелось найти какой‑то байпас. В API приложения был еще один метод, который генерирует PDF из DOCX и добавляет EXIF-метаинформацию из заголовка этого документа. Поскольку формат DOCX — это просто архив ZIP с набором XML-файлов, можно попробовать использовать полезные нагрузки с предыдущего этапа. Например, файл docProps/
содержит информацию о документе и в нем можно поменять заголовок. Пример полезной нагрузки для чтения файла:
test
-description<=/etc/passwd
С таким пейлоадом содержимое файла вернется в теге -description
в документе.
Так мне удалось обойти экранирование спецсимволов.
Но есть еще одна проблема — в случае с выполнением кода результат выполнения команды никуда не возвращается (а в тестируемом сервисе не было доступа в интернет, поэтому ответ было невозможно куда‑то отправить). Возникла идея вернуть результат выполнения в значение какого‑нибудь тега, который потом прилетит в PDF-документе.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее