Express Prototype Pollution Gadgets

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

Serve XSS responses

अधिक विवरण के लिए मूल अनुसंधान को देखें

Change JSON content-type to HTML

एक Express ऐप में JSON content type response का उपयोग करते हुए और एक 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 गुणों को दूषित करने से, Express को HTML सामग्री प्रकार की सेवा करने और _body गुण को प्रकट करने में सक्षम है, जिससे स्थायी XSS हो सकता है।

यूटीएफ-7 रेंडर करें

Express को यूटीएफ-7 सामग्री रेंडर करना संभव है:

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

सुरक्षित स्कैनिंग तकनीक

JSON अंतरिक्ष

निम्नलिखित PP एक JSON के अंदर विशेष अंतरिक्ष वाले गुण बनाएगा जो कार्यक्षमता को नहीं तोड़ेगा:

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

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

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

उजागरित हेडर

निम्नलिखित 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}}

त्रुटि

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

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

प्रतिबिंबित मान

जब एक एप्लिकेशन अपने प्रतिक्रिया में एक ऑब्जेक्ट शामिल करता है, तो __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

विविध

डॉट्स की अनुमति

Express में एक विकल्प है जो आपको **क्वेरी स्ट्रिंग पैरामीटर से ऑब्ज

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

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

संदर्भ

Last updated