Разбор: PokéBox с отбора X Кубка CTF
Условие: web, blackbox, раздатки нет. Платформа для обмена сейвами Pokémon Gen III: загружаешь .sav, сервер рисует карточку тренера. По таблице организаторов задание решили 136 раз.
Уязвимость
На карточке есть team chant — никнеймы покемонов из партии, склеенные в одну строку. Эта строка попадает в ERB-шаблон и рендерится на сервере. Значит, управляемый участником текст становится кодом: ERB SSTI.
Три препятствия
| Что мешает | Как обойти |
|---|---|
| Своя кодировка символов Gen III | в таблице есть нужные символы, а бэктика и звёздочки нет: отсюда выбор вызова чтения файла |
| Никнейм 10 байт, а пейлоад 25 символов | карточка склеивает ники без разделителя: один тег разбивается на трёх покемонов |
| Контрольная сумма секций сейва | пересчитать сумму Gen III после правки |
Что вынести
Ограничение на поле ничего не значит, если поля потом склеивают. И любой бинарный формат — это ввод пользователя.
Пример
Пример условный. Участник сначала пробует самый короткий тег с арифметикой, разбитый на двух покемонов. Сработало — значит, полный пейлоад стоит собирать.
Важно. Подставлять пользовательскую строку в текст шаблона нельзя, даже если она пришла из «файла игры». Для защиты передавайте значения в шаблон как данные.
Для разбора в команде
- ☐ Понятно, где склейка
- ☐ Таблица символов выписана
- ☐ Сумма пересчитана
- ☐ Способ защиты записан
Шаблон разбора заканчивается разделом про защиту: для attack-defense он пригодится 👇
Основание: условие и решение авторов задачи, репозиторий acisoru/ctfcup2026-quals, web/pokebox. Канал не принадлежит организаторам; официальный сайт — ctfcup.ru.