Advanced SSTI: Вызов методов и доступ к контексту
Эксплуатация SSTI через вызов методов объектов в контексте шаблона.
mediumgolangPro
Задача
# SSTI: персистентная инъекция в админ-шаблон email-уведомлений
## Сценарий
Вы получили доступ в админ-панель **SecureShop** под учётной записью администратора (полученной через предыдущий аудит/тестовый аккаунт). В админке есть «Email Template Designer»: визуальный редактор шаблона email-уведомлений, который рассылается всем покупателям при оформлении заказа. Команда уверена, что фича безопасна — редактор доступен только из admin-панели и предназначен для маркетинговых правок текста. По данным внутреннего аудита, контекст рендеринга email содержит конфиденциальную метку, не предназначенную для отображения; её требуется извлечь.
## Цель
1. Изучите, как именно «Email Template Designer» обрабатывает введённый шаблон: как обычную строку с подстановкой плейсхолдеров или как полноценный шаблонный код.
2. Исследуйте контекст рендеринга email — определите, какие поля доступны для подстановки, в том числе те, которые в стандартном UI editor не видны как разрешённые плейсхолдеры.
3. Извлеките значение секретной метки из контекста и получите флаг — через preview admin-панели или через email-уведомление при оформлении заказа.
## Теория
Server-Side Template Injection в админ-инструментах усиливается двумя факторами: (1) администратор имеет доступ ко **многим** ресурсам системы (контекст рендеринга часто богаче, чем у обычного пользователя), и (2) сохранённый шаблон применяется **глобально** — например, к каждому email-уведомлению о заказе. Это превращает single-shot SSTI в **персистентную** инъекцию: атакующий, имеющий админ-доступ один раз (через скомпрометированную учётку, инсайдера, цепочку другой уязвимости), оставляет «закладку», которая исполняется при каждом следующем рендеринге email — и её содержимое уходит конечным пользователям сервиса.
**Уязвимый паттерн:**
```go
// Шаблон, контролируемый администратором, исполняется при каждом email-рендеринге
tmpl, _ := template.New("email").Parse(adminTemplate)
tmpl.Execute(&buf, map[string]interface{}{
// богатый контекст с чувствительными значениями
})
```
Особенность Go-шаблонов в админ-сценарии — это контекст в форме `map[string]interface{}`, в который удобно прокидывать любые runtime-значения (env-переменные, секреты, данные текущей сессии). Без явного DTO-слоя в такой контекст легко попадает то, что не должно быть видно через шаблонизатор.
## Точка входа атаки
| Параметр | Значение |
|----------|----------|
| Логин администратора | `admin` / `LabAdmin2024!` |
| Эндпоинт настройки шаблона | `POST /admin/email-template` (через UI `GET /admin`) |
| Цель | секретная метка из контекста рендеринга email |