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

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

Blind SSTI: Notification Templates

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

Автор: Hack & Fix
Освоишь: логика вне шаблоновcontext-escapesandbox engine
Средне+60 XP ~40 мин python
CWE-1336 · A03:2021 Pro
Обложка: Blind SSTI: Notification Templates Обложка: Blind SSTI: Notification Templates
Задача
# Server-Side Template Injection (слепая, через уведомления) ## Сценарий Вы — внешние аудиторы **DevBazaar**, маркетплейса девайсов для разработчиков. Недавно подрядчик переработал email-уведомления: темы и тела писем редактируются в админ-панели и хранятся в базе, а отправленные копии попадают в журнал рассылки. Служба безопасности заказала проверку этой связки до следующей маркетинговой волны: рассылки уходят тысячами, и ошибка в шаблоне обойдётся дорого. ## Цель 1. Войдите администратором и найдите раздел редактирования шаблонов уведомлений и журнал отправленных писем. 2. Подтвердите, что тело шаблона исполняется сервером именно как шаблон. Форма предпросмотра не возвращает результат напрямую, поэтому ищите косвенный канал вывода и подтвердите наблюдение измеримым способом. 3. Извлеките CTF-флаг из переменных окружения процесса и прочитайте его там, куда приложение записывает результат рендеринга. ## Теория Ослеплённая (blind) SSTI отличается от классической только каналом вывода: приложение исполняет недоверенный текст как шаблон, но результат не показывает в ответе на сам запрос. Это задерживает атаку, но не останавливает её: результат рендеринга почти всегда куда-то записывается, а само исполнение подтверждается и по времени отклика. **Уязвимый паттерн:** ```python rendered = render_template_string( tmpl['body'], username='demo', order_id='12345' ) ``` Тело шаблона достаётся из базы и первым аргументом уходит в функцию, компилирующую произвольную строку как шаблон. Готовый текст приложение записывает в журнал уведомлений — оттуда и читается вывод. Дальше как в классической SSTI: из шаблонного контекста через специальные атрибуты добираются до переменных окружения процесса. ## Точка входа атаки `POST /admin/template/<id>` — сохранение шаблона, поля `subject` и `body`. `POST /admin/template/preview` — отправка уведомления с текущим телом (поле `template_id`); готовый текст появляется в журнале на `GET /admin/notifications`. * **Администратор:** `admin` / `SuperSecret` * **Обычный пользователь:** `demo` / `demo`

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

другие лабы по этой уязвимости
Обложка лабы: 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: Report Template RCE Обложка лабы: SSTI: Report Template RCE
SSTI

SSTI: Report Template RCE

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

+90 XP
Python Pro
Exploit Fix