Разбор: trustmebroker с отбора Кубка CTF 2025
Условие: брокерский офис принимает новых клиентов и подписывает бумаги. Участникам дают архив с исходниками и адрес сервера. Авторы описывают задачу так: SSRF через конвертор HTML в PDF и обход фильтра.
Ход решения
- Заметить, что /step2 разбирает JSON не в структуру, а в map[string]string, и данные потом уходят в генератор PDF
- Увидеть в docker-compose сервис admin, с которым основной сервис никак не взаимодействует: нужен SSRF
- Разобраться с фильтром: он убирает угловые скобки, кавычки и обратный слеш и обрезает значение до 17 символов
- Добавить в JSON произвольное поле: оно попадает в генератор, и его ключ подменяется значением прямо в документе
- Собрать iframe по частям из нескольких полей: тег внедряется внутрь уже существующего
- Открыть админку через SSRF, найти на /agreements первую запись, подставить номер договора в куку agreement_id и получить флаг
Что вынести
Если сервис делает PDF из HTML, проверьте две вещи: какие поля доходят до шаблона и куда генератор может ходить по сети. Лимит на длину поля не спасает, когда значения собираются вместе.
Чек-лист
- ☐ Схема сервисов разобрана по docker-compose
- ☐ Найден путь данных до генератора
- ☐ Фильтр проверен на своих полях
- ☐ Приём записан в разбор команды
Открыть «Разбор задачи для команды CTF» →
Основание: условие и решение авторов задачи, репозиторий acisoru/ctfcup2025-quals, tasks/web/trustmebroker. Канал не принадлежит организаторам; официальный сайт — ctfcup.ru.