Avatar Hi there, I'm Mohammed Muteb from Saudi Arabia, Cybersecurity Researcher & Programmer, I blog about Cybersecurity, Programming & other things, currently studying at the Saudi Electronic University & playing CTF w/ SaudiPwners, acknowledged by IBM | Twitter | Snapchat | AT&T | Google | Node.js | Dropbox | Facebook | Tumblr | Sony

What is Prototype Pollution

In this article I will explain the Prototype Pollution...

prototype ماهو

هو Object تم إستخدامه (وراثته) في Object آخر, مقارب هذا التعريف لتعريف inheritance في OOP وفعلا Inheritance OOP و prototype متشابهان إلى حد ما, كانت لغة Javascript تعتمد على prototypes لوراثة Objects ولهذا كانت قديما من ضمن تسمياتها هي prototype-based language فهي لم تكن OOP Language الذي نعتقدها سابقا مع ان prototype-based languages إحدى أشكال OOP ,فإذا أردنا نقوم بعمل prototype فإننا نعتمد لاللحصر على __proto__

_proto_ ماهو

هو property لأي Object يظهر لنا هيكل (تصميم) أي Object ويجعلنا نتحكم في Object methods/properties إلى حد ما وعن طريقه نقوم بما يسمى الprototype كالظاهر في الكود الآتي :-
let poc1 = {};
let poc2 = {myName: "Mohammed Muteb"};
poc1.__proto__ = poc2; // inheritance-like
console.log(poc1.myName);
// Output: "Mohammed Muteb"  --- Prototyped
image


تجعلنا prototype قادرين على وراثة جميع خصائص أي Object إلى أي Object نريد تقريبا مثل فكرة Inheritance OOP لكن هل نستطيع إساءة إستخدام prototypes والتالعب بها لصالح Attackers ؟ الجواب: نعم !

Pollution Prototype ثغرة

هي ثغرة تجعل Attackers قادرين على تغيير خصائص كل Objects الموجودة في Code JS عن طريق التالعب في Object واحد بإستخدام __proto__ ( لا للحصر ) اللذي قمنا سابقا بشرحها لكن كيف ؟

أسباب حدوثها وإستغلالها

جوابا على السؤال السابق هو اللجوء إلى unsafe merge/clone/extend التي قد تتواجد في مكاتب مصابه بها بسبب ان prototype أنت فيها لاتغير خصائص Object واحد فقط ! بل تستطيع تغيير او إضافة خصائص إلى كل Objects التي تعمل في code Javascript الخاص بك كما نرى في الكود الآتي :-
let poc1 = {};
let poc2 = {};
poc1.__proto__.pwned = "Pwned By u0pattern";
console.log(poc2.pwned); // أنا لم أضيف أي خصائص على الأوبجكت الثاني
// Output: "Pwned By u0pattern" Prototyped
image

او عن طريق unsafe assignment كما نرى في الكود الآتي :-

const json = '{"__proto__": {"isAdmin": true}}';
console.log(json);

userObject = JSON.parse(json)
const adminObject = {}

for (key of Object.keys(userObject)) {
    adminObject[key] = userObject[key];
}

console.log('User: ' + JSON.stringify(userObject));
console.log('Admin: ' + JSON.stringify(adminObject));
ماتراه في الصوره السابقه طبيعي جدا وهذا هو عمل prototype لكن متى نقول انك مصاب بثغرة Pollution Prototype ؟ نقولها عندما تجعل user قادرا على عمل prototype عن طريق -user input مما يجعله قادرا على التحكم بكل Objects التي قمت بكتابتها

مخاطرها وكيفية تجنبها

تعتمد خطورتها على طبيعة عمل target حيث أنها من الممكن أن تتسبب في ثغرات خطيرة أخرى مثل RCE و IDOR و Bypass Auth وغيرها من بقية الثغرات ألا وهي XSS وتجنب هذه الثغرة يتم بتجنب إعطاء user القدرة (user-input) على prototype وتضمين خصائص مثل __proto__ و constructor وإستخدام المكتبات الجيدة لأعمال مثل merge وغيرها مما ذكرنا مسبقا بإصداراتها الحديثة واألخيرة

أمثلة واقعية حصلت


RCE In Kibana: https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/
XSS In HackerOne (E-v1.js Wistia’s script) : https://hackerone.com/reports/986386

مصادر

https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes

https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance#prototypal_inheritance

https://www.youtube.com/watch?v=LUsiFV3dsK8

https://blog.0daylabs.com/2019/02/15/prototype-pollution-javascript/