Кубок CTF России

Разбор: 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.

Первоисточник