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

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

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

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

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

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

другие лабы по этой уязвимости
Обложка лабы: SSTI: Pug Template Engine в Express Обложка лабы: SSTI: Pug Template Engine в Express
SSTI

SSTI: Pug Template Engine в Express

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

+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