Blind SSTI: Notification Templates
Админ-шаблон email-уведомлений рендерится через render_template_string() — слепая SSTI через time-based payload.
mediumpythonPro
Задача
# Server-Side Template Injection: слепой через лог уведомлений
## Сценарий
Перед вами Flask-приложение интернет-магазина SecureShop. У администратора есть служебный раздел: настройка тел email-уведомлений (подтверждение заказа, приветствие нового пользователя). Тело шаблона хранится в базе данных. На каждое отправленное уведомление сервер прогоняет шаблон через шаблонизатор с подстановкой переменных пользователя/заказа/приложения и записывает итоговый текст в лог уведомлений, доступный администратору.
Как и в базовом SSTI, тело шаблона — это пользовательский ввод (со стороны администратора), который рендерится через машинерию шаблонизатора **как сам шаблон**. То есть в нём можно использовать не только разрешённые подстановки имён, но и любые выражения языка шаблонов: вычисления, обращения по атрибутам, доступ к встроенным глобалам Python — и через них до модуля работы с операционной системой и переменных окружения.
В отличие от базовой задачи, ответ на форму редактирования шаблона **не отображает** результат рендеринга атакующему. Канал обратной связи косвенный: после рендеринга текст уведомления попадает в лог, доступный администратору. Это делает SSTI «слепым» с точки зрения непосредственной формы, но содержательно ничем не безопаснее: всё, что нужно — найти место, где попадает результат рендера, и читать его оттуда.
## Цели
1. Войдите в админ-панель (учётные данные администратора в данных лабы) и найдите раздел редактирования шаблонов уведомлений.
2. Подтвердите, что тело шаблона действительно интерпретируется шаблонизатором сервера, а не выводится строкой. Удобно делать это через **косвенный** канал, поскольку прямого вывода нет.
3. Извлеките через SSTI значение CTF-флага из переменных окружения процесса; читайте результат там, где попадает вывод шаблона.
## Данные
| Параметр | Значение |
|----------|----------|
| Администратор | `admin` / `SuperSecret` |
| Обычный пользователь | `demo` / `demo` |