Добро пожаловать на BlackSAMP - ФОРУМ

  • Приватные и секретные разделы доступны только зарегистрированным пользователям.

    Вся важная информация в нашем ТГ: t.me/gtablack

    На данном форуме запрещено публиковать контент нарушающий Российское законодательство, за это последует блокировка ФА.

Уязвимость Prototype Pollution (Загрязнение прототипа) — скрытая угроза в JavaScript

Количество просмотров: 45

IlyaMarkinV

Редактор
Редактор
Регистрация
13 Июн 2025
Сообщения
4
Реакции
2
Баллы
3
Сегодня разберём неочевидную, но опасную уязвимость, которая встречается в JavaScriptPrototype Pollution (PP).

Что такое Prototype Pollution?
Это атака, при которой злоумышленник модифицирует прототип объекта в JavaScript, что может привести к:

- Изменению логики приложения
- XSS-атакам через переопределение встроенных методов
- Обходу проверок доступа
- Даже RCE (Remote Code Execution) в Node.js

Как это работает?
В JavaScript почти все объекты наследуются от
Код:
Object.prototype
Если злоумышленник может добавить или изменить свойства прототипа, это повлияет на все объекты в приложении.

Пример уязвимого кода
Допустим, есть функция, которая объединяет объекты:
Код:
javascript
function merge(target, source) {
    for (let key in source) {
        if (typeof target[key] === 'object' && typeof source[key] === 'object') {
            merge(target[key], source[key]);
        } else {
            target[key] = source[key]; // Уязвимость!
        }
    }
    return target;
}
Если передать в
Код:
source
объект с ключом
Код:
__proto__
Код:
javascript
const maliciousPayload = {
    __proto__: { isAdmin: true }
};
merge({}, maliciousPayload);
Теперь у всех объектов появится свойство
Код:
isAdmin: true!


Реальные последствия
1. Обход авторизации
Если приложение проверяет,
Код:
user.isAdmin
а злоумышленник загрязнил прототип, то любой пользователь станет админом.

2. XSS через переопределение методов
Например, если переопределить
Код:
Object.prototype.toString:
Код:
javascript
Object.prototype.toString = () => '<img src=x onerror=alert(1)>';
При выводе любого объекта в DOM может сработать XSS.

3. RCE в Node.js
Если приложение использует уязвимые библиотеки (например, для шаблонов), можно добиться выполнения произвольного кода.


Как защититься?
1. Замораживание прототипа
Код:
javascript
Object.freeze(Object.prototype);

2. Проверка ключей
Отвергать любые попытки установки
Код:
__proto__
,
Код:
constructor
и т. д.
Код:
javascript
if (key === '__proto__') throw new Error('Prototype pollution attempt!');

3. Использование Map вместо объектов
Map не наследует свойства от Object.prototype

4. Обновление зависимостей
Многие npm-пакеты (например, lodash hoek) имели уязвимости PP — всегда обновляйте их


Вывод
Prototype Pollution — это тихий убийца JavaScript-приложений. Она может быть незаметна до момента эксплуатации, но последствия — катастрофичны.
 
Последнее редактирование:
Сверху Снизу