Dom Clobbering
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
यह id
और name
के गुणों के साथ HTML टैग में JS संदर्भ के भीतर वैश्विक चर उत्पन्न करना संभव है।
केवल कुछ तत्व name attribute का उपयोग करके ग्लोबल्स को क्लॉबर कर सकते हैं, वे हैं: embed
, form
, iframe
, image
, img
और object
।
दिलचस्प बात यह है कि जब आप एक form element का उपयोग करके एक वेरिएबल को clobber करते हैं, तो आपको तत्व का toString
मान मिलेगा: [object HTMLFormElement]
लेकिन anchor के साथ toString
एंकर का href
होगा। इसलिए, यदि आप a
टैग का उपयोग करके क्लॉबर करते हैं, तो आप string के रूप में व्यवहार करते समय value को control कर सकते हैं:
यह एक एरे और ऑब्जेक्ट विशेषताओं को क्लॉबर करना भी संभव है:
एक 3rd विशेषता (जैसे x.y.z) को क्लॉबर करने के लिए, आपको एक form
का उपयोग करने की आवश्यकता है:
Clobbering अधिक विशेषताओं को अधिक जटिल है लेकिन फिर भी संभव है, iframes का उपयोग करके:
स्टाइल टैग का उपयोग iframes को रेंडर करने के लिए पर्याप्त समय देने के लिए किया जाता है। इसके बिना आपको undefined का अलर्ट मिलेगा।
गहरे गुणों को क्लॉबर करने के लिए, आप html एन्कोडिंग के साथ iframes का उपयोग इस तरह कर सकते हैं:
यदि एक फ़िल्टर किसी नोड के गुणों के माध्यम से लूपिंग कर रहा है जैसे कि document.getElementByID('x').attributes
तो आप .attributes
गुण को क्लॉबर कर सकते हैं और फ़िल्टर को टूट सकते हैं। अन्य DOM गुण जैसे tagName
, nodeName
या parentNode
और भी क्लॉबर करने योग्य हैं।
window.someObject
JavaScript में यह सामान्य है कि:
पृष्ठ पर HTML को संशोधित करना someObject
को एक DOM नोड के साथ ओवरराइड करने की अनुमति देता है, जो संभावित रूप से सुरक्षा कमजोरियों को पेश कर सकता है। उदाहरण के लिए, आप someObject
को एक एंकर तत्व के साथ बदल सकते हैं जो एक दुर्भावनापूर्ण स्क्रिप्ट की ओर इशारा करता है:
एक कमजोर कोड जैसे:
यह विधि स्क्रिप्ट स्रोत का उपयोग करके अवांछित कोड निष्पादित करती है।
ट्रिक: DOMPurify
आपको cid:
प्रोटोकॉल का उपयोग करने की अनुमति देता है, जो डबल-कोट्स को URL-एन्कोड नहीं करता। इसका मतलब है कि आप एक एन्कोडेड डबल-कोट्स इंजेक्ट कर सकते हैं जो रनटाइम पर डिकोड होगा। इसलिए, कुछ इस तरह इंजेक्ट करना <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
HTML एन्कोडेड "
को रनटाइम पर डिकोड करेगा और एट्रिब्यूट वैल्यू से बाहर निकलने के लिए onerror
इवेंट बनाएगा।
एक अन्य तकनीक form
तत्व का उपयोग करती है। कुछ क्लाइंट-साइड पुस्तकालय नए बनाए गए फॉर्म तत्व के एट्रिब्यूट्स की जांच करते हैं ताकि उन्हें साफ किया जा सके। हालाँकि, फॉर्म के अंदर id=attributes
के साथ एक input
जोड़कर, आप प्रभावी रूप से एट्रिब्यूट्स प्रॉपर्टी को ओवरराइट कर देते हैं, जिससे सेनिटाइज़र को वास्तविक एट्रिब्यूट्स तक पहुँचने से रोका जा सकता है।
आप इस प्रकार के क्लॉबरिंग का एक उदाहरण इस CTF लेख में पा सकते हैं।
दस्तावेज़ के अनुसार, DOM क्लॉबरिंग का उपयोग करके दस्तावेज़ ऑब्जेक्ट के एट्रिब्यूट्स को ओवरराइट करना संभव है:
Document इंटरफेस named properties का समर्थन करता है। Document ऑब्जेक्ट दस्तावेज़ के supported property names में किसी भी क्षण निम्नलिखित होते हैं, tree order के अनुसार जो तत्व उन्हें योगदान देता है, बाद की डुप्लिकेट्स को नजरअंदाज करते हुए, और जब एक ही तत्व दोनों का योगदान देता है तो id एट्रिब्यूट्स से मान पहले आते हैं:
- सभी exposed embed, form, iframe, img, और exposed object तत्वों के लिए नाम सामग्री एट्रिब्यूट का मान जो एक गैर-खाली नाम सामग्री एट्रिब्यूट है और in a document tree में है जिसमें दस्तावेज़ उनके root के रूप में है; - सभी exposed object तत्वों के लिए id सामग्री एट्रिब्यूट का मान जो एक गैर-खाली id सामग्री एट्रिब्यूट है और in a document tree में है जिसमें दस्तावेज़ उनके root के रूप में है; - सभी img तत्वों के लिए id सामग्री एट्रिब्यूट का मान जो एक गैर-खाली id सामग्री एट्रिब्यूट और एक गैर-खाली नाम सामग्री एट्रिब्यूट दोनों हैं, और in a document tree में हैं जिसमें दस्तावेज़ उनके root के रूप में है।
इस तकनीक का उपयोग करके आप सामान्यतः उपयोग किए जाने वाले मान जैसे document.cookie
, document.body
, document.children
, और यहां तक कि दस्तावेज़ इंटरफेस में विधियों को जैसे document.querySelector
को ओवरराइट कर सकते हैं।
document.getElementById()
और document.querySelector()
के कॉल के परिणामों को एक समान id विशेषता के साथ <html>
या <body>
टैग इंजेक्ट करके बदला जा सकता है। इसे इस तरह किया जा सकता है:
इसके अलावा, इन इंजेक्टेड HTML/body टैग्स को छिपाने के लिए शैलियों का उपयोग करके, innerText
में अन्य पाठ से हस्तक्षेप को रोका जा सकता है, इस प्रकार हमले की प्रभावशीलता को बढ़ाया जा सकता है:
SVG की जांच से पता चला कि <body>
टैग को भी प्रभावी ढंग से उपयोग किया जा सकता है:
SVG में ब्राउज़रों जैसे Chrome और Firefox में HTML टैग के कार्य करने के लिए, एक <foreignobject>
टैग आवश्यक है:
यह संभव है कि आप किसी फॉर्म के अंदर नए प्रविष्टियाँ जोड़ें केवल कुछ टैग्स के अंदर form
विशेषता को निर्दिष्ट करके। आप इसका उपयोग फॉर्म के अंदर नए मान जोड़ने और यहां तक कि एक नया बटन जोड़ने के लिए कर सकते हैं इसे भेजने के लिए (क्लिकजैकिंग या कुछ .click()
JS कोड का दुरुपयोग करते हुए):
अधिक फ़ॉर्म विशेषताओं के लिए बटन की जांच करें।
हेयस, गैरेथ। हैकर्स के लिए जावास्क्रिप्ट: एक हैकर की तरह सोचना सीखें।
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)