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

13 KiB

शैडो डॉम

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

मूलभूत जानकारी

शैडो डॉम वेब कंपोनेंट्स फीचर स्यूट का हिस्सा है, जिसका उद्देश्य JS डेवलपर्स को अपने कस्टम तत्वों को बनाने के लिए उनके फंक्शनैलिटी को वेबसाइट कोड से अलग करके पुनःउपयोगी बनाने की अनुमति देना है।

मूल रूप से, आप शैडो डॉम का उपयोग करके अपने कंपोनेंट के HTML और CSS को वेबपेज के बाकी कोड से अलग कर सकते हैं। उदाहरण के लिए, यदि आप शैडो डॉम में तत्व आईडी बनाते हैं, तो वे मूल डॉम में तत्व आईडी के साथ टकराएगा नहीं। आप अपने शैडो डॉम में उपयोग करने वाले किसी भी CSS सेलेक्टर का प्रयोग केवल शैडो डॉम में ही लागू होगा और मूल डॉम में नहीं, और आप मूल डॉम में उपयोग करने वाले किसी भी सेलेक्टर का प्रयोग शैडो डॉम में नहीं करेंगे।

// creating a shadow DOM
let $element = document.createElement("div");
$shadowDomRef = $element.attachShadow({ mode: "open" }); // open or closed

आमतौर पर, जब आप एक "खुला" छाया DOM को एक तत्व से जोड़ते हैं, तो आप $element.shadowRoot के साथ छाया DOM का संदर्भ प्राप्त कर सकते हैं। हालांकि, यदि छाया DOM "बंद" मोड के तहत जुड़ा होता है, तो आप इस तरीके से इसे प्राप्त नहीं कर सकते हैं। चाहे जितनी भी डेवलपर दस्तावेज़ीकरण पढ़ लें, मुझे अभी भी थोड़ी सी अस्पष्टता है कि बंद मोड का उद्देश्य क्या है। Google के अनुसार:

"बंद" मोड के एक और रूप को छाया DOM कहा जाता है। जब आप एक बंद छाया पेड़ बनाते हैं, तो बाहरी JavaScript आपके कंपोनेंट के आंतरिक DOM तक पहुंच नहीं पा सकता। यह <video> जैसे प्राकृतिक तत्वों के काम करने की तरह है। JavaScript <video> के छाया DOM तक पहुंच नहीं कर सकता क्योंकि ब्राउज़र इसे बंद मोड छाया रूट का उपयोग करके लागू करता है।

हालांकि, वे यह भी कहते हैं:

बंद मोड छाया रूट बहुत उपयोगी नहीं है। कुछ डेवलपर बंद मोड को एक कृत्रिम सुरक्षा सुविधा के रूप में देखेंगे। लेकिन यह स्पष्ट हो जाए, यह कोई सुरक्षा सुविधा नहीं है।

छाया DOM तक पहुंच

window.find() और पाठ चयन

फ़ंक्शन window.find("search_text") छाया DOM के भीतर प्रवेश करता है। यह फ़ंक्शन प्रभावी रूप से वेबपेज पर ctrl-F की तरह कार्य करती है।

यह संभव है कि आप document.execCommand("SelectAll") को कॉल करके चयन को जितना संभव हो सके विस्तारित करें और फिर window.getSelection() को कॉल करें छाया DOM में चयनित पाठ की सामग्री लौटाएं

firefox में आप getSelection() का उपयोग कर सकते हैं जो एक Selection ऑब्जेक्ट लौटाता है, जहां anchorElement एक छाया DOM में तत्व के लिए संदर्भ है। इसलिए, हम छाया DOM की सामग्री को निम्नलिखित तरीके से निकाल सकते हैं:

getSelection().anchorNode.parentNode.parentNode.parentNode.innerHTML

लेकिन यह Chromium में काम नहीं करता।

contenteditable या CSS इंजेक्शन

एक तरीका है जिससे हम शैडो डॉम के साथ इंटरैक्ट कर सकते हैं वह है जब हमारे पास इसके अंदर HTML या JS इंजेक्शन हो। कुछ दिलचस्प स्थितियाँ हैं जहां आप एक शैडो डॉम के भीतर इंजेक्शन प्राप्त कर सकते हैं, जहां आप एक सामान्य crossorigin पेज पर नहीं कर सकते हैं।

एक उदाहरण है, यदि आपके पास contenteditable एट्रिब्यूट के साथ कोई तत्व है। यह एक पुराना और कम उपयोग होने वाला HTML एट्रिब्यूट है जो इस तत्व की सामग्री को उपयोगकर्ता-संपादनीय घोषित करता है। हम संग्रहों का उपयोग कर सकते हैं इसके साथ और document.execCommand API का उपयोग करके contenteditable तत्व के साथ इंटरैक्ट कर सकते हैं और HTML इंजेक्शन प्राप्त कर सकते हैं!

find('selection within contenteditable');

document.execCommand('insertHTML',false,'<svg/onload=console.log(this.parentElement.outerHTML)>')

शायद और भी रोचक है, contenteditable को क्रोमियम में किसी भी तत्व पर घोषित किया जा सकता है जब एक अप्रचलित CSS गुण: -webkit-user-modify:read-write लागू किया जाता है।

इससे हमें एक CSS/स्टाइल इंजेक्शन को एक HTML इंजेक्शन में उठा सकते हैं, एक तत्व पर CSS गुण जोड़कर और फिर insertHTML कमांड का उपयोग करके।

CTF

इस तकनीक का उपयोग CTF चैलेंज के रूप में किया गया था, इस लेख में देखें: https://github.com/Super-Guesser/ctf/blob/master/2022/dicectf/shadow.md

संदर्भ

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