Basic SSTI: Кастомное приветствие
Утечка конфиденциальных данных из контекста страницы через небезопасную обработку шаблонов.
easygolangPro
Задача
# SSTI: Server-Side Template Injection через настраиваемое приветствие
## Сценарий
Вы зарегистрированы в интернет-магазине **SecureShop** как пользователь **demo**. На странице профиля доступна функция «Персональное приветствие»: пользователь вводит текст, который сервер использует при рендеринге HTML-страницы. Команда внедрила эту фичу, чтобы пользователи могли видеть собственное персонализированное приветствие на странице. По данным внутреннего аудита, в контексте, передаваемом в шаблонизатор страницы, присутствует поле с конфиденциальной меткой — она хранится для служебных целей и не должна быть видна обычному пользователю. Требуется извлечь это значение, имея только обычную учётную запись.
## Цель
1. Изучите, как именно поле «Персональное приветствие» обрабатывается сервером — как обычная строка для отображения или как-то иначе.
2. Сформируйте payload, заставляющий сервер выйти за рамки «текста приветствия» и обратиться к окружающему контексту.
3. Извлеките значение секретной метки из контекста, передаваемого в шаблонизатор.
## Теория
Server-Side Template Injection (SSTI) — класс уязвимостей, при которых пользовательский ввод интерпретируется не как **данные** для подстановки в шаблон, а как **исходный код** самого шаблона. Если приложение пропускает пользовательскую строку через парсер шаблонизатора (`Parse`/`compile`/`fromstring`), она получает доступ к полному контексту рендеринга — структуре данных, переданной для подстановки в страницу. В шаблонных движках большинства языков это включает все поля переданной модели, иногда — обращения к глобальным объектам и методам.
**Уязвимый паттерн:**
```go
// Пользовательский ввод парсится как код шаблона, а не подставляется как данные
tmpl, _ := template.New("greeting").Parse(userInput)
tmpl.Execute(w, pageData) // pageData содержит все поля контекста, в том числе чувствительные
```
В Go стандартные шаблонизаторы (`text/template`, `html/template`) одинаково уязвимы к SSTI на уровне парсинга, но возможности атакующего ограничены **структурой переданных данных**: нет универсальной рефлексии (как в Python Jinja2 через `__class__.__mro__`), доступны только поля и методы того, что явно передано в `Execute`. Однако этого часто достаточно — в `pageData` обычно содержатся текущий пользователь (с паролем, ролью, токенами), CSRF-токен, флаги доступа и другие чувствительные значения.
## Точка входа атаки
`POST /profile/greeting` — форма редактирования персонального приветствия. Параметр `greeting_template` принимает произвольную строку и сохраняется в профиль пользователя; при следующем рендеринге страницы профиля сервер использует это значение для отображения приветствия.
* **Учётные данные:** `demo` / `demo`
* **Цель:** извлечь значение секретной метки из контекста рендеринга страницы профиля.