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

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

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

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

Автор: Hack & Fix
Освоишь: Object.create(null)schema-валидацияfreeze prototypes
Средне+60 XP ~40 мин nodejs
CWE-1321 · A08:2021 Pro
Обложка: Prototype Pollution: загрязнение Object.prototype через recursive merge Обложка: Prototype Pollution: загрязнение Object.prototype через recursive merge
Задача
# Prototype Pollution (Загрязнение прототипа) ## Сценарий «ВольтМаркет» — внутренний магазин компании, где сотрудники покупают фирменную электронику и сувениры. Команда недавно добавила персональные настройки профиля и уверяет, что JSON-API принимает только темы оформления и параметры уведомлений. На код-ревью заметили, что сервер сливает присланный документ с сохранёнными настройками рекурсивно и не ограничивает имена ключей, — вас, специалиста по безопасности, попросили оценить, чем это грозит. В служебной части магазина есть эндпоинт, который отдаёт флаг только пользователям с признаком администратора, и ни у одной учётной записи этот признак не установлен. ## Цель 1. Авторизуйтесь под тестовой учётной записью и изучите страницу профиля с настройками. 2. Через эндпоинт обновления настроек измените на уровне общего прототипа объектов значение, которое читает проверка прав администратора. 3. Обратитесь к служебному эндпоинту выдачи флага и заберите награду. ## Теория JavaScript-объекты наследуют свойства через цепочку прототипов: у каждого объекта есть скрытая ссылка на объект-родитель, и имена, не найденные у самого объекта, ищутся в родителе. Если приложение позволяет задавать произвольные ключи во вложенном JSON без фильтрации служебных имён, один документ меняет поведение всех объектов процесса. Этот класс уязвимости называется Prototype Pollution: после атаки любая проверка вида «если у объекта есть флаг» начинает возвращать значение, выбранное атакующим, — даже если самому объекту это поле никогда не назначалось. **Уязвимый паттерн:** ```js // Рекурсивное слияние пользовательского JSON без фильтрации ключей: for (const key of Object.keys(source)) { if (typeof source[key] === 'object') descend(target[key], source[key]); } ``` Цикл спускается вглубь по любому ключу входного документа. Когда ключом оказывается служебное имя, ссылающееся на прототип, шаг рекурсии попадает не в новое поле, а в общий родительский объект — и запись уходит туда. Проверка прав в служебном эндпоинте читает своё булево поле через цепочку наследования, поэтому после загрязнения прототипа она пропускает любого вошедшего пользователя. ## Точка входа атаки `POST /profile/preferences` — JSON-эндпоинт обновления настроек: принимает произвольный вложенный объект и рекурсивно сливает его с сохранёнными настройками. На странице `/profile` есть готовая форма отправки. `GET /admin/flag` — служебный эндпоинт: возвращает флаг, если у текущего пользователя есть признак администратора; нужен запрос с кукой сессии. * **Тестовая учётная запись:** `demo` / `demo`

Похожие лабораторные (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 → 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