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

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

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