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

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

Prototype Pollution → RCE через гаджет в EJS

Админ-панель SecureShop рекурсивно сливает JSON-патч предпочтений с in-memory объектом, что позволяет загрязнить Object.prototype. Превью дашборда через EJS читает опции компиляции через цепочку прототипов — это превращает prototype pollution в RCE-гаджет и даёт чтение LAB_FLAG.

Автор: Hack & Fix
Освоишь: Object.create(null)schema-валидацияfreeze prototypes
Сложно+90 XP ~70 мин nodejs
CWE-1321 · A08:2021 Pro
Обложка: Prototype Pollution → RCE через гаджет в EJS Обложка: Prototype Pollution → RCE через гаджет в EJS
Задача
# Prototype Pollution (Гаджет в шаблонизаторе) ## Сценарий «НордБутик» — бутик-магазин с админ-панелью для операторов. Операторы настраивают собственный дашборд: заголовок, текст футера, имя в приветствии. Клиент присылает JSON-патч, сервер рекурсивно сливает его с внутренним объектом предпочтений, чтобы менять только нужные поля. Посмотреть результат можно на странице предпросмотра дашборда, которая собирает HTML через шаблонизатор EJS. Ревьюер заметил, что слияние не фильтрует имена ключей, а шаблонизатор часть своих настроечных полей читает обычным доступом по свойству. Вас, аудитора, попросили проверить, собирается ли из этих двух фактов опасная цепочка. ## Цель 1. Войдите администратором и изучите предпросмотр дашборда и эндпоинт патча предпочтений. 2. Через патч предпочтений загрязните общий прототип объектов строкой, которая попадёт в опции компиляции шаблонизатора. 3. Добейтесь выполнения своего кода в процессе сервера и прочитайте секретную переменную окружения — в ней флаг. ## Теория Prototype Pollution сам по себе — «тихое» присваивание: атакующий меняет значение, которое прочтут чужие объекты, но код при этом не выполняется. Опасность раскрывается в связке с гаджетом — кодом, который читает некое свойство через цепочку прототипов и использует прочитанное опасным образом. Шаблонизатор EJS при компиляции берёт ряд настроечных полей из внутреннего объекта опций простым доступом по свойству: если поля нет у самого объекта, чтение проваливается в прототип. Отдельные из этих значений движок подставляет в генерируемый код буквально. **Уязвимый паттерн:** ```js // Рекурсивный merge патча без фильтрации ключей: for (const k in src) { if (typeof src[k] === 'object') deep(dst[k], src[k]); } ``` Механика словами: ключ со служебным именем уводит рекурсию слияния в общий прототип, и записанная туда строка наследуется объектом опций при следующем рендере. Шаблонизатор читает её как настроечное поле и вставляет в тело функции, которую компилирует для предпросмотра, — загрязнение превращается в выполнение произвольного JavaScript в процессе сервера, а оттуда доступен и объект окружения процесса. ## Точка входа атаки `POST /admin/preferences` — JSON-патч предпочтений дашборда, рекурсивно сливается с внутренним объектом (требуется роль администратора). `GET /admin/dashboard-preview` — предпросмотр дашборда: рендерит текущие предпочтения через EJS (тот же guard роли). * **Администратор (доступ выдан вам для аудита):** `admin` / `SuperSecret`

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

другие лабы по этой уязвимости
Обложка лабы: Prototype Pollution: загрязнение Object.prototype приводит к DoS публичных эндпоинтов Обложка лабы: Prototype Pollution: загрязнение Object.prototype приводит к DoS публичных эндпоинтов
Proto Poll

Prototype Pollution: загрязнение Object.prototype приводит к DoS публичных эндпоинтов

Express-эндпоинт POST /profile/settings делает рекурсивный merge JSON-объекта в per-user настройки без фильтрации __proto__. Атакующий загрязняет Object.prototype, после чего hot-path обработчик /catalog падает с 500 на каждом запросе — Denial of Service. Endpoint /api/incident-response регистрирует инцидент и выдаёт флаг.

+90 XP
Node.js Pro
Exploit Fix
Обложка лабы: Prototype Pollution: загрязнение Object.prototype через recursive merge Обложка лабы: Prototype Pollution: загрязнение Object.prototype через recursive merge
Proto Poll

Prototype Pollution: загрязнение Object.prototype через recursive merge

Эндпоинт обновления пользовательских настроек в Express делает recursive merge тела запроса без фильтрации ключа __proto__. Загрязни Object.prototype.isAdmin и получи доступ к /admin/flag.

+60 XP
Node.js Pro
Exploit Fix