Перейти к содержимому

Поиск по платформе

SSTI: Report Template RCE

Пользовательский шаблон отчёта рендерится через render_template_string() — SSTI позволяет выполнить произвольный код через цепочку __subclasses__.

Автор: Hack & Fix
Освоишь: логика вне шаблоновcontext-escapesandbox engine
Сложно+90 XP ~70 мин python
CWE-1336 · A03:2021 Pro
Обложка: SSTI: Report Template RCE Обложка: SSTI: Report Template RCE
Задача
# Server-Side Template Injection с эскалацией до выполнения команд ## Сценарий Вы — участник программы безопасности **PixelPort**, магазина электроники. Недавно магазин дал покупателям «конструктор отчётов»: в личном кабинете задаётся собственный шаблон отчёта с подстановками данных профиля — имени, баланса, числа заказов, — и по кнопке генерируется готовый отчёт. Отчёты охотно используют корпоративные клиенты, и перед тем как рассказать о фиче всем, продуктовая команда попросила вас её протестировать на прочность. ## Цель 1. Войдите под учётной записью обычного покупателя и найдите поле шаблона отчёта с подстановками данных профиля. 2. Подтвердите, что сервер исполняет текст шаблона, а не показывает его как есть (классический индикатор — арифметическое выражение). 3. Эскалируйте от вычисления выражений до выполнения системной команды: через объектную модель Python доберитесь до класса запуска подпроцессов, выполните команду и прочитайте CTF-флаг из окружения процесса. ## Теория Шаблонизатор без изоляции — это окно в интерпретатор: выражения шаблона вычисляются с полным доступом к объектной модели Python. Если через цепочки специальных атрибутов из базовой SSTI читаются переменные окружения, то на шаг дальше лежит полноценное выполнение команд с правами процесса приложения. **Уязвимый паттерн:** ```python preview = render_template_string( user['report_template'], username=user['username'], balance=user['balance'], order_count=order_count, role=user['role']) ``` Тело шаблона целиком поступает в компилятор произвольных шаблонов. В Python у каждого класса есть атрибут иерархии наследования, а у корневого объекта — перечисление всех загруженных классов-потомков. Среди них всегда есть класс, запускающий подпроцессы: обращение к нему из шаблона и вызов с командой — это уже не чтение данных, а исполнение кода операционной системы. ## Точка входа атаки `POST /profile/template` — сохранение шаблона отчёта, поле `report_template` (с CSRF-токеном). Превью рендеринга — `GET /reports`, сохранённый отчёт — `POST /reports/generate` (поле `title`). * **Обычный пользователь:** `demo` / `demo`

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: Blind SSTI: Notification Templates Обложка лабы: Blind SSTI: Notification Templates
SSTI

Blind SSTI: Notification Templates

Админ-шаблон email-уведомлений рендерится через render_template_string() — слепая SSTI через time-based payload.

+60 XP
Python Pro
Exploit Fix
Обложка лабы: SSTI: User Greeting Обложка лабы: SSTI: User Greeting
SSTI

SSTI: User Greeting

Пользовательское приветствие рендерится через render_template_string() — SSTI позволяет читать секреты и выполнять код.

+30 XP
Python Pro
Exploit Fix
Обложка лабы: SSTI: Format String Injection Обложка лабы: SSTI: Format String Injection
SSTI

SSTI: Format String Injection

Форма восстановления пароля использует str.format() с пользовательским шаблоном — атакующий может читать атрибуты объектов через {username.__class__.__init__.__globals__}.

+30 XP
Python Pro
Exploit Fix
Обложка лабы: SSTI Email: Инъекция шаблона в email-сообщение Обложка лабы: SSTI Email: Инъекция шаблона в email-сообщение
SSTI

SSTI Email: Инъекция шаблона в email-сообщение

SSTI-уязвимость: пользовательский ввод передаётся в template.Parse(), позволяя читать серверные данные.

+90 XP
Go Pro
Exploit Fix