Pull to refresh

Comments 8

Для Object.create(null):
Например, кто-то захочет вызвать на этом объекте toString() и в ответ получит undefined.


Все же получит "...toString is not a function"
Вы не могли бы подробнее рассказать, кто выполняет пейлоад из параметров запроса?
В клиентском/серверном коде уже должен быть троян, который достанет строку из location.search и выполнит ее? Тогда непонятно зачем заморачиваться с прототипами, сразу alert можно.
Вы не могли бы подробнее рассказать, кто выполняет пейлоад из параметров запроса?
Пейлод сначала обрабатывается кодом, который уязвим к prototype pollution. В этот момент происходит собственно prototype pollution, следствием которого является изменение значения некоторых переменных. После этого в определенный момент код использует измененное значение переменных, которое приводит к XSS / RCE /…
В клиентском/серверном коде уже должен быть троян, который достанет строку из location.search и выполнит ее? Тогда непонятно зачем заморачиваться с прототипами, сразу alert можно.
Код, который обрабатывает значение из location.search может не приводить XSS, но приводить к prototype pollution. Если не учитывать prototype pollution в данном случае, то мы пропускаем уязвимость :)
Довольно интересно! Спасибо за ещё один пример почему не стоит использовать объекты как словарь. Особенно когда существую решения на подобии Map.

Ну, по идее же, точно так же можно изменить и Map.prototype

Речь шла о хранении location.search с помощью Map.

При вызове map.set('__proto__', someValue) просто создастся запись в Map в которой будет строковой ключ '__proto__'.
А вот вызов map['__proto__'] = someValue может содержать нежелательные для нас последствия описанные в статье.

Тут я описываю более простое решение. Если вкратце, то это полное удаление __proto__ из рантайма, и проверка "является ли свойство собственным" во всяких deep merge.

Sign up to leave a comment.