Перейти к содержимому
← Каталог nodejs SSRF

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

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

hardnodejsPro
Задача
# Server-Side Template Injection: персональное приветствие ## Сценарий Перед вами Node.js + Express приложение интернет-магазина SecureShop, использующее шаблонизатор Nunjucks для основной разметки и EJS для одного особого случая. На странице профиля пользователю доступна настройка персонального приветствия: он вводит произвольный текст в поле формы, нажимает «Сохранить», и при каждом следующем визите профиля сервер показывает это приветствие. Реализация выглядит безобидно — это же просто строка пользователя, которая отдаётся обратно на его собственную страницу. Но обработчик профиля делает с этой строкой одну операцию, которая в production-коде категорически не должна применяться к недоверенному вводу: пропускает её через шаблонизатор EJS **как сам шаблон**, а не как данные внутри уже скомпилированного шаблона. EJS — это мини-язык программирования: внутри тегов `<%= ... %>` и `<%- ... %>` он вычисляет произвольные JavaScript-выражения на сервере. У этих выражений есть полный доступ к Node.js runtime: глобальные объекты `process`, `global`, а через `process.mainModule.require` — к любому встроенному модулю (`fs`, `child_process`). А именно в переменных окружения процесса хранится CTF-флаг. ## Цели 1. Найдите поле ввода произвольного текста, содержимое которого затем отображается на странице — на нём можно проверить, как именно сервер обрабатывает ввод. 2. Эмпирически подтвердите, что сервер не просто показывает текст «как есть», а **выполняет** его (простейший детектор — арифметическое выражение, которое вернётся вычисленным). 3. Через доступ к глобальному объекту `process` в выражении шаблона извлеките значение переменной окружения `LAB_FLAG` — это и есть CTF-флаг. ## Данные | Параметр | Значение | |----------|----------| | Обычный пользователь | `demo` / `demo` |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru