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

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

SSTI: Pug Template Engine в Express

Профиль SecureShop рендерит пользовательское приветствие через pug.render() — SSTI в JavaScript-окружении с чтением секретов и RCE.

Автор: Hack & Fix
Освоишь: логика вне шаблоновcontext-escapesandbox engine
Сложно+90 XP ~70 мин nodejs
CWE-1336 · A03:2021 Pro
Обложка: SSTI: Pug Template Engine в Express Обложка: SSTI: Pug Template Engine в Express
Задача
# SSTI (Инъекция шаблона Pug) ## Сценарий «ВегаБутик» — бутик одежды и аксессуаров с онлайн-витриной. В профиле покупателя есть «персональное приветствие»: произвольная строка, которая показывается владельцу при каждом входе. Фича выглядит безобидной — строка пользователя возвращается на его же страницу. Но обработчик профиля перед выводом пропускает эту строку через шаблонизатор Pug как исходник шаблона, а не как данные. Ревьюер поднял тревогу, и вас попросили оценить, что из этого можно извлечь: в переменных окружения серверного процесса хранится секрет, и добыть его — цель аудита. ## Цель 1. Авторизуйтесь и найдите поле, ввод которого возвращается на страницу профиля. 2. Докажите, что сервер вычисляет введённый текст как шаблон, а не возвращает его как данные. 3. Через синтаксис шаблонов добейтесь выполнения кода на сервере и прочитайте секретную переменную окружения — в ней флаг. ## Теория Server-Side Template Injection возникает, когда недоверенная строка попадает в шаблонизатор как код шаблона, а не как данные. Pug компилирует шаблон в функцию, и его грамматика рассчитана на программистов, а не на пользовательский текст: внутри интерполяции вычисляются JavaScript-выражения, а служебная директиза позволяет исполнить целую строку кода. Глобальные объекты Node.js видны из этого кода напрямую. **Уязвимый паттерн:** ```js // Пользовательская строка рендерится как Pug-шаблон: greetingRendered = pug.render(user.greeting, { name, username }); ``` Механика словами: строка из поля приветствия передаётся движку в роли исходника шаблона, поэтому записанные в его синтаксисе выражения и кодовые строки исполняются на сервере. До секрета достаточно дотянуться одним выражением: глобальный объект процесса содержит коллекцию переменных окружения, остаётся выбрать в ней нужное имя и вывести значение. ## Точка входа атаки `POST /profile/greeting` — форма сохранения приветствия: поле `greeting`. `GET /profile` — страница профиля: рендерит сохранённое приветствие. * **Тестовая учётная запись:** `demo` / `demo`

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

другие лабы по этой уязвимости
Обложка лабы: SSTI: внедрение JavaScript-кода в EJS-шаблон Обложка лабы: SSTI: внедрение JavaScript-кода в EJS-шаблон
SSTI

SSTI: внедрение JavaScript-кода в EJS-шаблон

Server-Side Template Injection в Express + EJS: пользовательский ввод используется как сам EJS-шаблон, что позволяет выполнить произвольный JavaScript на сервере и прочитать переменные окружения.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: SSTI: User Greeting Обложка лабы: SSTI: User Greeting
SSTI

SSTI: User Greeting

Пользовательское приветствие в SecureShop рендерится через nunjucks.renderString() — SSTI позволяет выполнять JS и читать переменные окружения.

+30 XP
Node.js Pro
Exploit Fix
Обложка лабы: SSTI Email: Инъекция шаблона в email-сообщение Обложка лабы: SSTI Email: Инъекция шаблона в email-сообщение
SSTI

SSTI Email: Инъекция шаблона в email-сообщение

SSTI-уязвимость: пользовательский ввод передаётся в template.Parse(), позволяя читать серверные данные.

+90 XP
Go 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