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

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

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 регистрирует инцидент и выдаёт флаг.

Автор: Hack & Fix
Освоишь: Object.create(null)schema-валидацияfreeze prototypes
Сложно+90 XP ~70 мин nodejs
CWE-1321 · A08:2021 Pro
Обложка: Prototype Pollution: загрязнение Object.prototype приводит к DoS публичных эндпоинтов Обложка: Prototype Pollution: загрязнение Object.prototype приводит к DoS публичных эндпоинтов
Задача
# Prototype Pollution (Отказ в обслуживании) ## Сценарий «ГаджетПолка» — интернет-магазин гаджетов и аксессуаров, работающий на одном Node-процессе. Служба поддержки жалуется, что после релиза персональных настроек профиля витрина нередко «зависает для всех сразу», а логи полны ошибок отрисовки каталога. Ревью показало: обновление настроек рекурсивно сливает присланный JSON с серверным деревом, не фильтруя имена ключей, а витрина при отрисовке перебирает свойства объектов товара унаследованным обходом. Вас попросили воспроизвести инцидент и объяснить механизм. ## Цель 1. Авторизуйтесь под тестовой учётной записью и убедитесь, что каталог работает. 2. Через эндпоинт обновления настроек загрязните общий прототип объектов значением примитивного типа. 3. Добейтесь, чтобы публичный каталог перестал открываться для всех посетителей. 4. Заберите флаг из диагностического эндпоинта, фиксирующего инцидент. ## Теория JavaScript-объекты наследуют свойства через цепочку прототипов, а цикл обхода свойств вида «for-in» посещает не только собственные ключи объекта, но и унаследованные перечисляемые. Если приложение сливает пользовательский JSON без фильтрации служебных имён, атакующий может записать посторонний ключ прямо в общий прототип — и его начнут «видеть» все обычные объекты процесса. Это Prototype Pollution; в связке с кодом, который обходит объекты унаследованным циклом и ждёт от значений определённого типа, загрязнение превращается в отказ в обслуживании: одна некорректная запись ломает отрисовку для всех. **Уязвимый паттерн:** ```js // Слияние входного JSON без фильтрации ключей: for (const key in src) { if (typeof src[key] === 'object') merge(dst[key], src[key]); } ``` Механика словами: ключ со служебным именем уводит рекурсию в общий прототип, и записанное туда значение примитивного типа наследуют все объекты. Отрисовка каталога перебирает теги товара унаследованным циклом и приводит каждое значение к верхнему регистру как строку; на числе такой вызов бросает исключение, обработчик падает, и витрина отдаёт ошибку сервера на каждом запросе — пока процесс не перезапустят. ## Точка входа атаки `POST /profile/settings` — JSON-эндпоинт обновления настроек: тело — произвольный вложенный объект, сливается с серверным деревом настроек. `GET /catalog` — публичная витрина: после загрязнения отдаёт ошибку сервера каждому посетителю. `GET /api/incident-response` — диагностика дежурной смены: сравнивает текущие ключи общего прототипа с эталоном, снятым при старте, и при наличии посторонних ключей выдаёт флаг. * **Тестовая учётная запись:** `demo` / `demo`

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

другие лабы по этой уязвимости
Обложка лабы: Prototype Pollution → RCE через гаджет в EJS Обложка лабы: Prototype Pollution → RCE через гаджет в EJS
Proto Poll

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

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

+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