# DOM XSS {{#include ../../banners/hacktricks-training.md}} ## DOM Vulnerabilities DOM कमजोरियाँ तब होती हैं जब हमलावर-नियंत्रित **स्रोतों** (जैसे `location.search`, `document.referrer`, या `document.cookie`) से डेटा असुरक्षित रूप से **सिंक** में स्थानांतरित किया जाता है। सिंक वे फ़ंक्शन या ऑब्जेक्ट होते हैं (जैसे, `eval()`, `document.body.innerHTML`) जो यदि दुर्भावनापूर्ण डेटा दिया जाए तो हानिकारक सामग्री को निष्पादित या प्रस्तुत कर सकते हैं। - **स्रोत** वे इनपुट हैं जिन्हें हमलावरों द्वारा हेरफेर किया जा सकता है, जिसमें URLs, कुकीज़, और वेब संदेश शामिल हैं। - **सिंक** संभावित रूप से खतरनाक एंडपॉइंट हैं जहाँ दुर्भावनापूर्ण डेटा प्रतिकूल प्रभावों का कारण बन सकता है, जैसे कि स्क्रिप्ट निष्पादन। जोखिम तब उत्पन्न होता है जब डेटा एक स्रोत से एक सिंक में उचित सत्यापन या सफाई के बिना प्रवाहित होता है, जिससे XSS जैसे हमलों की अनुमति मिलती है। > [!NOTE] > **आप स्रोतों और सिंक की एक अधिक अद्यतन सूची** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki) **में पा सकते हैं।** **सामान्य स्रोत:** ```javascript document.URL document.documentURI document.URLUnencoded document.baseURI location document.cookie document.referrer window.name history.pushState history.replaceState localStorage sessionStorage IndexedDB(mozIndexedDB, webkitIndexedDB, msIndexedDB) Database ``` **सामान्य सिंक:** | [**ओपन रीडायरेक्ट**](dom-xss.md#open-redirect) | [**जावास्क्रिप्ट इंजेक्शन**](dom-xss.md#javascript-injection) | [**DOM-डेटा हेरफेर**](dom-xss.md#dom-data-manipulation) | **jQuery** | | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------- | | `location` | `eval()` | `scriptElement.src` | `add()` | | `location.host` | `Function() constructor` | `scriptElement.text` | `after()` | | `location.hostname` | `setTimeout()` | `scriptElement.textContent` | `append()` | | `location.href` | `setInterval()` | `scriptElement.innerText` | `animate()` | | `location.pathname` | `setImmediate()` | `someDOMElement.setAttribute()` | `insertAfter()` | | `location.search` | `execCommand()` | `someDOMElement.search` | `insertBefore()` | | `location.protocol` | `execScript()` | `someDOMElement.text` | `before()` | | `location.assign()` | `msSetImmediate()` | `someDOMElement.textContent` | `html()` | | `location.replace()` | `range.createContextualFragment()` | `someDOMElement.innerText` | `prepend()` | | `open()` | `crypto.generateCRMFRequest()` | `someDOMElement.outerText` | `replaceAll()` | | `domElem.srcdoc` | **\`\`**[**स्थानीय फ़ाइल-पथ हेरफेर**](dom-xss.md#local-file-path-manipulation) | `someDOMElement.value` | `replaceWith()` | | `XMLHttpRequest.open()` | `FileReader.readAsArrayBuffer()` | `someDOMElement.name` | `wrap()` | | `XMLHttpRequest.send()` | `FileReader.readAsBinaryString()` | `someDOMElement.target` | `wrapInner()` | | `jQuery.ajax()` | `FileReader.readAsDataURL()` | `someDOMElement.method` | `wrapAll()` | | `$.ajax()` | `FileReader.readAsText()` | `someDOMElement.type` | `has()` | | **\`\`**[**Ajax अनुरोध हेरफेर**](dom-xss.md#ajax-request-manipulation) | `FileReader.readAsFile()` | `someDOMElement.backgroundImage` | `constructor()` | | `XMLHttpRequest.setRequestHeader()` | `FileReader.root.getFile()` | `someDOMElement.cssText` | `init()` | | `XMLHttpRequest.open()` | `FileReader.root.getFile()` | `someDOMElement.codebase` | `index()` | | `XMLHttpRequest.send()` | [**लिंक हेरफेर**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` | | `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` | | `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**क्लाइंट-साइड JSON इंजेक्शन**](dom-xss.md#client-side-sql-injection) | | **\`\`**[**HTML5-स्टोरेज हेरफेर**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` | | `sessionStorage.setItem()` | [**XPath इंजेक्शन**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` | | `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` | | **``**[**`सेवा का इनकार`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**कुकी हेरफेर**](dom-xss.md#cookie-manipulation) | | `requestFileSystem()` | **\`\`**[**डॉक्यूमेंट-डोमेन हेरफेर**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` | | `RegExp()` | `document.domain` | `history.pushState()` | [**WebSocket-URL विषाक्तता**](dom-xss.md#websocket-url-poisoning) | | [**क्लाइंट-साइड SQL इंजेक्शन**](dom-xss.md#client-side-sql-injection) | [**वेब-संदेश हेरफेर**](dom-xss.md#web-message-manipulation) | `history.replaceState()` | `WebSocket` | | `executeSql()` | `postMessage()` | \`\` | \`\` | **`innerHTML`** सिंक किसी भी आधुनिक ब्राउज़र पर `script` तत्वों को स्वीकार नहीं करता है, न ही `svg onload` घटनाएँ चलेंगी। इसका मतलब है कि आपको `img` या `iframe` जैसे वैकल्पिक तत्वों का उपयोग करना होगा। इस प्रकार का XSS शायद **खोजने के लिए सबसे कठिन** है, क्योंकि आपको JS कोड के अंदर देखना होगा, यह देखना होगा कि क्या यह **किसी वस्तु का उपयोग कर रहा है** जिसका **मूल्य आप नियंत्रित करते हैं**, और इस मामले में, यह देखना होगा कि क्या इसे मनमाने JS को निष्पादित करने के लिए **दुरुपयोग करने का कोई तरीका है**। ## उन्हें खोजने के उपकरण - [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized) - संभावित सिंक तक पहुँचने वाले हर डेटा की जाँच करने के लिए ब्राउज़र एक्सटेंशन: [https://github.com/kevin-mizu/domloggerpp](https://github.com/kevin-mizu/domloggerpp) ## उदाहरण ### ओपन रीडायरेक्ट से: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection) **DOM में ओपन रीडायरेक्ट कमजोरियाँ** तब होती हैं जब एक स्क्रिप्ट डेटा लिखती है, जिसे एक हमलावर नियंत्रित कर सकता है, एक सिंक में जो डोमेन के बीच नेविगेशन शुरू करने में सक्षम है। यह समझना महत्वपूर्ण है कि मनमाना कोड निष्पादित करना, जैसे कि **`javascript:alert(1)`**, संभव है यदि आपके पास उस URL की शुरुआत पर नियंत्रण है जहाँ रीडायरेक्शन होता है। सिंक: ```javascript location location.host location.hostname location.href location.pathname location.search location.protocol location.assign() location.replace() open() domElem.srcdoc XMLHttpRequest.open() XMLHttpRequest.send() jQuery.ajax() $.ajax() ``` ### कुकी हेरफेर From: [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation) DOM-आधारित कुकी-हेरफेर कमजोरियाँ तब होती हैं जब एक स्क्रिप्ट डेटा को शामिल करती है, जिसे एक हमलावर द्वारा नियंत्रित किया जा सकता है, कुकी के मान में। यदि कुकी का उपयोग साइट के भीतर किया जाता है, तो यह कमजोरी वेबपेज के अप्रत्याशित व्यवहार का कारण बन सकती है। इसके अतिरिक्त, यदि कुकी उपयोगकर्ता सत्रों को ट्रैक करने में शामिल है, तो इसका उपयोग सत्र स्थिरीकरण हमले को अंजाम देने के लिए किया जा सकता है। इस कमजोरी से संबंधित प्राथमिक सिंक है: Sinks: ```javascript document.cookie ``` ### JavaScript Injection From: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection) DOM-आधारित JavaScript इंजेक्शन कमजोरियाँ तब उत्पन्न होती हैं जब एक स्क्रिप्ट डेटा चलाती है, जिसे एक हमलावर द्वारा नियंत्रित किया जा सकता है, JavaScript कोड के रूप में। Sinks: ```javascript eval() Function() constructor setTimeout() setInterval() setImmediate() execCommand() execScript() msSetImmediate() range.createContextualFragment() crypto.generateCRMFRequest() ``` ### Document-domain manipulation From: [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation) **डॉक्यूमेंट-डोमेन मैनिपुलेशन कमजोरियाँ** तब होती हैं जब एक स्क्रिप्ट `document.domain` प्रॉपर्टी को ऐसे डेटा का उपयोग करके सेट करती है जिसे एक हमलावर नियंत्रित कर सकता है। `document.domain` प्रॉपर्टी ब्राउज़रों द्वारा **समान-स्रोत नीति** के **कार्यांवयन** में एक **मुख्य भूमिका** निभाती है। जब विभिन्न स्रोतों से दो पृष्ठ अपने `document.domain` को **एक ही मान** पर सेट करते हैं, तो वे बिना किसी प्रतिबंध के बातचीत कर सकते हैं। हालांकि ब्राउज़र्स `document.domain` के लिए असाइन किए जाने वाले मानों पर कुछ **सीमाएँ** लगाते हैं, जो वास्तविक पृष्ठ स्रोत के लिए पूरी तरह से असंबंधित मानों के असाइनमेंट को रोकते हैं, लेकिन अपवाद मौजूद हैं। आमतौर पर, ब्राउज़र्स **चाइल्ड** या **पैरेंट डोमेन्स** के उपयोग की अनुमति देते हैं। Sinks: ```javascript document.domain ``` ### WebSocket-URL poisoning From: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](https://portswigger.net/web-security/dom-based/websocket-url-poisoning) **WebSocket-URL poisoning** तब होता है जब एक स्क्रिप्ट **नियंत्रित डेटा को WebSocket कनेक्शन के लिए लक्षित URL के रूप में उपयोग करती है**। Sinks: `WebSocket` कंस्ट्रक्टर WebSocket-URL poisoning कमजोरियों की ओर ले जा सकता है। ### Link manipulation From: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation) **DOM-आधारित लिंक-मैनिपुलेशन कमजोरियाँ** तब उत्पन्न होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को वर्तमान पृष्ठ के भीतर एक नेविगेशन लक्ष्य** पर लिखती है, जैसे कि एक क्लिक करने योग्य लिंक या एक फॉर्म का सबमिशन URL। Sinks: ```javascript someDOMElement.href someDOMElement.src someDOMElement.action ``` ### Ajax अनुरोध हेरफेर From: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation) **Ajax अनुरोध हेरफेर कमजोरियाँ** तब उत्पन्न होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को एक Ajax अनुरोध में लिखती है** जो `XmlHttpRequest` ऑब्जेक्ट का उपयोग करके जारी किया जाता है। Sinks: ```javascript XMLHttpRequest.setRequestHeader() XMLHttpRequest.open() XMLHttpRequest.send() jQuery.globalEval() $.globalEval() ``` ### स्थानीय फ़ाइल-पथ हेरफेर From: [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation) **स्थानीय फ़ाइल-पथ हेरफेर की कमजोरियाँ** तब उत्पन्न होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को फ़ाइल-हैंडलिंग API** में `filename` पैरामीटर के रूप में पास करती है। इस कमजोरी का उपयोग एक हमलावर द्वारा एक URL बनाने के लिए किया जा सकता है जो, यदि किसी अन्य उपयोगकर्ता द्वारा देखा जाए, तो **उपयोगकर्ता के ब्राउज़र को एक मनमाना स्थानीय फ़ाइल खोलने या लिखने** के लिए प्रेरित कर सकता है। Sinks: ```javascript FileReader.readAsArrayBuffer() FileReader.readAsBinaryString() FileReader.readAsDataURL() FileReader.readAsText() FileReader.readAsFile() FileReader.root.getFile() FileReader.root.getFile() ``` ### क्लाइंट-साइड SQL इंजेक्शन From: [https://portswigger.net/web-security/dom-based/client-side-sql-injection](https://portswigger.net/web-security/dom-based/client-side-sql-injection) **क्लाइंट-साइड SQL-इंजेक्शन कमजोरियाँ** तब होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को एक क्लाइंट-साइड SQL क्वेरी में असुरक्षित तरीके से शामिल करती है**। Sinks: ```javascript executeSql() ``` ### HTML5-storage manipulation From: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation) **HTML5-storage manipulation vulnerabilities** तब उत्पन्न होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को वेब ब्राउज़र के HTML5 स्टोरेज में स्टोर करती है** (`localStorage` या `sessionStorage`)। जबकि यह क्रिया स्वाभाविक रूप से एक सुरक्षा कमजोरी नहीं है, यह समस्या बन जाती है यदि एप्लिकेशन बाद में **स्टोर किए गए डेटा को पढ़ता है और इसे असुरक्षित तरीके से प्रोसेस करता है**। इससे एक हमलावर को स्टोरेज तंत्र का लाभ उठाकर अन्य DOM-आधारित हमले करने की अनुमति मिल सकती है, जैसे कि क्रॉस-साइट स्क्रिप्टिंग और जावास्क्रिप्ट इंजेक्शन। Sinks: ```javascript sessionStorage.setItem() localStorage.setItem() ``` ### XPath इंजेक्शन From: [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](https://portswigger.net/web-security/dom-based/client-side-xpath-injection) **DOM-आधारित XPath-इंजेक्शन कमजोरियाँ** तब होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को XPath क्वेरी में शामिल करती है**। Sinks: ```javascript document.evaluate() someDOMElement.evaluate() ``` ### क्लाइंट-साइड JSON इंजेक्शन From: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection) **DOM-आधारित JSON-इंजेक्शन कमजोरियाँ** तब होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को एक स्ट्रिंग में शामिल करती है जिसे JSON डेटा संरचना के रूप में पार्स किया जाता है और फिर एप्लिकेशन द्वारा प्रोसेस किया जाता है**। Sinks: ```javascript JSON.parse() jQuery.parseJSON() $.parseJSON() ``` ### वेब-संदेश हेरफेर From: [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation) **वेब-संदेश कमजोरियाँ** तब उत्पन्न होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को एक वेब संदेश के रूप में दूसरे दस्तावेज़** में भेजती है। कमजोर वेब-संदेश हेरफेर का एक **उदाहरण** [PortSwigger's Web Security Academy](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source) पर पाया जा सकता है। Sinks: `postMessage()` विधि का उपयोग करके वेब संदेश भेजने से कमजोरियाँ उत्पन्न हो सकती हैं यदि संदेश प्राप्त करने के लिए इवेंट लिस्नर आने वाले डेटा को असुरक्षित तरीके से संभालता है। ### DOM-डेटा हेरफेर From: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation) **DOM-डेटा हेरफेर कमजोरियाँ** तब उत्पन्न होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को DOM के एक क्षेत्र में लिखती है** जिसका उपयोग दृश्य UI या क्लाइंट-साइड लॉजिक में किया जाता है। इस कमजोरी का उपयोग एक हमलावर द्वारा एक URL बनाने के लिए किया जा सकता है जो, यदि किसी अन्य उपयोगकर्ता द्वारा देखा जाता है, तो क्लाइंट-साइड UI की उपस्थिति या व्यवहार को बदल सकता है। Sinks: ```javascript scriptElement.src scriptElement.text scriptElement.textContent scriptElement.innerText someDOMElement.setAttribute() someDOMElement.search someDOMElement.text someDOMElement.textContent someDOMElement.innerText someDOMElement.outerText someDOMElement.value someDOMElement.name someDOMElement.target someDOMElement.method someDOMElement.type someDOMElement.backgroundImage someDOMElement.cssText someDOMElement.codebase document.title document.implementation.createHTMLDocument() history.pushState() history.replaceState() ``` ### Denial of Service From: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service) **DOM-आधारित सेवा से इनकार की कमजोरियाँ** तब होती हैं जब एक स्क्रिप्ट **हमलावर-नियंत्रित डेटा को एक समस्याग्रस्त प्लेटफ़ॉर्म API** में असुरक्षित रूप से पास करती है। इसमें ऐसे APIs शामिल हैं, जो जब सक्रिय होते हैं, तो उपयोगकर्ता के कंप्यूटर को **अत्यधिक मात्रा में CPU या डिस्क स्थान** का उपभोग करने के लिए प्रेरित कर सकते हैं। ऐसी कमजोरियों के महत्वपूर्ण दुष्प्रभाव हो सकते हैं, जैसे कि ब्राउज़र वेबसाइट की कार्यक्षमता को सीमित कर देता है, डेटा को `localStorage` में स्टोर करने के प्रयासों को अस्वीकार करके या व्यस्त स्क्रिप्ट को समाप्त करके। Sinks: ```javascript requestFileSystem() RegExp() ``` ## डॉम क्लॉबरिंग {{#ref}} dom-clobbering.md {{#endref}} {{#include ../../banners/hacktricks-training.md}}