SSTI: Pug Template Engine в Express
Профиль SecureShop рендерит пользовательское приветствие через pug.render() — SSTI в JavaScript-окружении с чтением секретов и RCE.
hardnodejsPro
Задача
# Server-Side Template Injection: персональное приветствие
## Сценарий
Перед вами Node.js-приложение интернет-магазина SecureShop, написанное на Express. На странице профиля пользователю доступна настройка персонального приветствия: он вводит произвольный текст в поле формы, нажимает «Сохранить», и при каждом следующем визите профиля сервер показывает это приветствие.
Реализация выглядит безобидно — это же просто строка пользователя, которая отдаётся обратно на его собственную страницу. Но обработчик профиля делает с этой строкой одну операцию, которая в production-коде категорически не должна применяться к недоверенному вводу: пропускает её через машинерию шаблонизатора **как сам шаблон**, а не как данные внутри уже скомпилированного шаблона. Шаблонизатор Pug — мощный язык; он умеет вычислять JavaScript-выражения внутри интерполяции `#{...}`, выполнять блоки кода через директиву `- ...`, обращаться к глобальным объектам Node.js — и через стандартный объект `process` приводит к доступу к переменным окружения, а через `require('child_process')` — к выполнению произвольных системных команд. А именно в переменных окружения хранится CTF-флаг.
## Цели
1. Найдите поле ввода произвольного текста, содержимое которого затем отображается на странице — на нём можно проверить, как именно сервер обрабатывает ввод.
2. Эмпирически подтвердите, что сервер не просто показывает текст «как есть», а **выполняет** его (простейший детектор — арифметическое выражение, которое вернётся вычисленным).
3. Через стандартные глобальные объекты Node.js дотянитесь до переменных окружения процесса и извлеките CTF-флаг.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |