mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
301 lines
22 KiB
Markdown
301 lines
22 KiB
Markdown
# DOM XSS
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## DOM Açıkları
|
||
|
||
DOM açıkları, saldırgan kontrolündeki **kaynaklardan** (örneğin `location.search`, `document.referrer` veya `document.cookie`) verilerin güvensiz bir şekilde **sinklere** aktarılması durumunda ortaya çıkar. Sinkler, kötü niyetli veriler verildiğinde zararlı içeriği çalıştırabilen veya render edebilen fonksiyonlar veya nesnelerdir (örneğin, `eval()`, `document.body.innerHTML`).
|
||
|
||
- **Kaynaklar**, saldırganlar tarafından manipüle edilebilen URL'ler, çerezler ve web mesajları gibi girdilerdir.
|
||
- **Sinkler**, kötü niyetli verilerin olumsuz etkilere yol açabileceği potansiyel olarak tehlikeli uç noktalarıdır, örneğin script çalıştırma.
|
||
|
||
Risk, verilerin bir kaynaktan bir sinke uygun bir doğrulama veya sanitasyon olmadan akması durumunda ortaya çıkar ve bu da XSS gibi saldırılara olanak tanır.
|
||
|
||
> [!NOTE]
|
||
> **Kaynaklar ve sinkler için daha güncel bir listeyi** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki) **bulabilirsiniz.**
|
||
|
||
**Yaygın kaynaklar:**
|
||
```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
|
||
```
|
||
**Ortak Sıvılar:**
|
||
|
||
| [**Açık Yönlendirme**](dom-xss.md#open-redirect) | [**Javascript Enjeksiyonu**](dom-xss.md#javascript-injection) | [**DOM-veri manipülasyonu**](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` | **\`\`**[**Yerel dosya yolu manipülasyonu**](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 isteği manipülasyonu**](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()` | [**Bağlantı manipülasyonu**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` |
|
||
| `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` |
|
||
| `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**İstemci tarafı JSON enjeksiyonu**](dom-xss.md#client-side-sql-injection) |
|
||
| **\`\`**[**HTML5-depolama manipülasyonu**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` |
|
||
| `sessionStorage.setItem()` | [**XPath enjeksiyonu**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` |
|
||
| `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` |
|
||
| **``**[**`Hizmet Reddi`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Çerez manipülasyonu**](dom-xss.md#cookie-manipulation) |
|
||
| `requestFileSystem()` | **\`\`**[**Belge-alan manipülasyonu**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` |
|
||
| `RegExp()` | `document.domain` | `history.pushState()` | [**WebSocket-URL zehirlenmesi**](dom-xss.md#websocket-url-poisoning) |
|
||
| [**İstemci Tarafı SQL enjeksiyonu**](dom-xss.md#client-side-sql-injection) | [**Web-mesaj manipülasyonu**](dom-xss.md#web-message-manipulation) | `history.replaceState()` | `WebSocket` |
|
||
| `executeSql()` | `postMessage()` | \`\` | \`\` |
|
||
|
||
**`innerHTML`** sıvısı, modern tarayıcılarda `script` öğelerini kabul etmez, ayrıca `svg onload` olayları da tetiklenmez. Bu, `img` veya `iframe` gibi alternatif öğeler kullanmanız gerektiği anlamına gelir.
|
||
|
||
Bu tür bir XSS muhtemelen **bulması en zor olanıdır**, çünkü JS kodunun içine bakmanız, **kontrol ettiğiniz** herhangi bir nesneyi **kullanıp kullanmadığını** görmeniz ve bu durumda, keyfi JS çalıştırmak için **herhangi bir şekilde kötüye kullanma** olup olmadığını kontrol etmeniz gerekir.
|
||
|
||
## Onları bulmak için araçlar
|
||
|
||
- [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized)
|
||
- Potansiyel bir sıvıya ulaşan her veriyi kontrol etmek için tarayıcı uzantısı: [https://github.com/kevin-mizu/domloggerpp](https://github.com/kevin-mizu/domloggerpp)
|
||
|
||
## Örnekler
|
||
|
||
### Açık Yönlendirme
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection)
|
||
|
||
**DOM'daki açık yönlendirme güvenlik açıkları**, bir saldırganın kontrol edebileceği verilerin bir sıvıya yazıldığı ve bu sıvının alanlar arasında yönlendirme başlatma yeteneğine sahip olduğu durumlarda ortaya çıkar.
|
||
|
||
Yönlendirmenin gerçekleştiği URL'nin başlangıcını kontrol ediyorsanız, **`javascript:alert(1)`** gibi keyfi kod çalıştırmanın mümkün olduğunu anlamak önemlidir.
|
||
|
||
Sıvılar:
|
||
```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()
|
||
```
|
||
### Cookie manipülasyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation)
|
||
|
||
DOM tabanlı cookie-manipülasyon zafiyetleri, bir script'in bir saldırgan tarafından kontrol edilebilen verileri bir cookie'nin değerine dahil etmesi durumunda meydana gelir. Bu zafiyet, cookie sitenin içinde kullanıldığında web sayfasının beklenmedik bir şekilde davranmasına yol açabilir. Ayrıca, cookie kullanıcı oturumlarını takip etmekte kullanılıyorsa, oturum sabitleme saldırısı gerçekleştirmek için de istismar edilebilir. Bu zafiyetle ilişkili ana sink şudur:
|
||
|
||
Sinks:
|
||
```javascript
|
||
document.cookie
|
||
```
|
||
### JavaScript Enjeksiyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection)
|
||
|
||
DOM tabanlı JavaScript enjeksiyonu zafiyetleri, bir saldırgan tarafından kontrol edilebilen verilerin JavaScript kodu olarak çalıştırıldığı durumlarda oluşur.
|
||
|
||
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 manipulation vulnerabilities** bir saldırganın kontrol edebileceği verileri kullanarak `document.domain` özelliğini ayarladığında ortaya çıkar.
|
||
|
||
`document.domain` özelliği, tarayıcılar tarafından **same-origin policy**'nin **uygulanmasında** **anahtar bir rol** oynar. Farklı kökenlerden gelen iki sayfa `document.domain`'larını **aynı değere** ayarladıklarında, kısıtlama olmaksızın etkileşimde bulunabilirler. Tarayıcılar, `document.domain`'a atanabilir değerlere belirli **sınırlamalar** getirse de, tamamen alakasız değerlerin gerçek sayfa kökenine atanmasını engeller, istisnalar mevcuttur. Genellikle, tarayıcılar **çocuk** veya **ebeveyn** alanlarının kullanımına izin verir.
|
||
|
||
Sinks:
|
||
```javascript
|
||
document.domain
|
||
```
|
||
### WebSocket-URL zehirlenmesi
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](https://portswigger.net/web-security/dom-based/websocket-url-poisoning)
|
||
|
||
**WebSocket-URL zehirlenmesi**, bir scriptin **kontrol edilebilir verileri WebSocket bağlantısı için hedef URL olarak kullanması** durumunda meydana gelir.
|
||
|
||
Sinks:
|
||
|
||
`WebSocket` yapıcıları, WebSocket-URL zehirlenmesi güvenlik açıklarına yol açabilir.
|
||
|
||
### Bağlantı manipülasyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation)
|
||
|
||
**DOM tabanlı bağlantı manipülasyonu güvenlik açıkları**, bir scriptin **saldırgan tarafından kontrol edilebilen verileri mevcut sayfadaki bir navigasyon hedefine** yazması durumunda ortaya çıkar; bu, tıklanabilir bir bağlantı veya bir formun gönderim URL'si gibi olabilir.
|
||
|
||
Sinks:
|
||
```javascript
|
||
someDOMElement.href
|
||
someDOMElement.src
|
||
someDOMElement.action
|
||
```
|
||
### Ajax isteği manipülasyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation)
|
||
|
||
**Ajax isteği manipülasyonu zafiyetleri**, bir script'in **saldırgan tarafından kontrol edilebilen verileri bir Ajax isteğine yazması** durumunda ortaya çıkar ve bu istek bir `XmlHttpRequest` nesnesi kullanılarak yapılır.
|
||
|
||
Sinks:
|
||
```javascript
|
||
XMLHttpRequest.setRequestHeader()
|
||
XMLHttpRequest.open()
|
||
XMLHttpRequest.send()
|
||
jQuery.globalEval()
|
||
$.globalEval()
|
||
```
|
||
### Yerel dosya yolu manipülasyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation)
|
||
|
||
**Yerel dosya yolu manipülasyonu zafiyetleri**, bir script'in **saldırgan kontrolündeki verileri bir dosya işleme API'sine** `filename` parametresi olarak geçmesi durumunda ortaya çıkar. Bu zafiyet, bir saldırgan tarafından, başka bir kullanıcı tarafından ziyaret edilirse **kullanıcının tarayıcısının rastgele bir yerel dosyayı açmasına veya yazmasına** neden olabilecek bir URL oluşturmak için kullanılabilir.
|
||
|
||
Sinks:
|
||
```javascript
|
||
FileReader.readAsArrayBuffer()
|
||
FileReader.readAsBinaryString()
|
||
FileReader.readAsDataURL()
|
||
FileReader.readAsText()
|
||
FileReader.readAsFile()
|
||
FileReader.root.getFile()
|
||
FileReader.root.getFile()
|
||
```
|
||
### İstemci Tarafı SQL Enjeksiyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/client-side-sql-injection](https://portswigger.net/web-security/dom-based/client-side-sql-injection)
|
||
|
||
**İstemci tarafı SQL enjeksiyonu zafiyetleri**, bir script'in **saldırgan tarafından kontrol edilebilen verileri istemci tarafı SQL sorgusuna güvensiz bir şekilde dahil etmesi** durumunda meydana gelir.
|
||
|
||
Sinks:
|
||
```javascript
|
||
executeSql()
|
||
```
|
||
### HTML5-depolama manipülasyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation)
|
||
|
||
**HTML5-depolama manipülasyonu zafiyetleri**, bir script'in **saldırgan tarafından kontrol edilebilen verileri web tarayıcısının HTML5 depolamasında** (`localStorage` veya `sessionStorage`) sakladığında ortaya çıkar. Bu eylem doğası gereği bir güvenlik zafiyeti olmasa da, uygulama daha sonra **saklanan verileri okuyup güvensiz bir şekilde işlediğinde** sorun haline gelir. Bu, bir saldırganın depolama mekanizmasını kullanarak diğer DOM tabanlı saldırıları gerçekleştirmesine olanak tanıyabilir, örneğin cross-site scripting ve JavaScript enjeksiyonu.
|
||
|
||
Sinks:
|
||
```javascript
|
||
sessionStorage.setItem()
|
||
localStorage.setItem()
|
||
```
|
||
### XPath enjeksiyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](https://portswigger.net/web-security/dom-based/client-side-xpath-injection)
|
||
|
||
**DOM tabanlı XPath enjeksiyonu zafiyetleri**, bir scriptin **saldırgan tarafından kontrol edilebilen verileri bir XPath sorgusuna dahil etmesi** durumunda meydana gelir.
|
||
|
||
Sinks:
|
||
```javascript
|
||
document.evaluate()
|
||
someDOMElement.evaluate()
|
||
```
|
||
### İstemci tarafı JSON enjeksiyonu
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection)
|
||
|
||
**DOM tabanlı JSON enjeksiyon zafiyetleri**, bir scriptin **saldırgan tarafından kontrol edilebilen verileri, bir JSON veri yapısı olarak ayrıştırılan bir dizeye dahil edip ardından uygulama tarafından işlenmesi** durumunda meydana gelir.
|
||
|
||
Sinks:
|
||
```javascript
|
||
JSON.parse()
|
||
jQuery.parseJSON()
|
||
$.parseJSON()
|
||
```
|
||
### Web-message manipulation
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation)
|
||
|
||
**Web-message güvenlik açıkları**, bir script'in **saldırgan tarafından kontrol edilebilen verileri bir web mesajı olarak başka bir belgeye** göndermesi durumunda ortaya çıkar. **Kırılgan** Web-message manipülasyonu örneği [PortSwigger'in Web Güvenliği Akademisi](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source) adresinde bulunabilir.
|
||
|
||
Sinks:
|
||
|
||
`postMessage()` metodu ile web mesajları göndermek, mesajları almak için kullanılan olay dinleyicisi gelen verileri güvensiz bir şekilde işliyorsa güvenlik açıklarına yol açabilir.
|
||
|
||
### DOM-data manipulation
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation)
|
||
|
||
**DOM-veri manipülasyonu güvenlik açıkları**, bir script'in **saldırgan tarafından kontrol edilebilen verileri DOM içindeki bir alana** yazması durumunda ortaya çıkar; bu alan görünür UI veya istemci tarafı mantığında kullanılır. Bu güvenlik açığı, bir saldırgan tarafından, başka bir kullanıcı tarafından ziyaret edilirse istemci tarafı UI'sının görünümünü veya davranışını değiştirebilecek bir URL oluşturmak için kullanılabilir.
|
||
|
||
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()
|
||
```
|
||
### Hizmet Reddi
|
||
|
||
From: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service)
|
||
|
||
**DOM tabanlı hizmet reddi zafiyetleri**, bir scriptin **saldırgan kontrolündeki verileri sorunlu bir platform API'sine güvensiz bir şekilde iletmesi** durumunda meydana gelir. Bu, çağrıldığında kullanıcının bilgisayarının **aşırı miktarda CPU veya disk alanı** tüketmesine neden olabilecek API'leri içerir. Bu tür zafiyetler, tarayıcının verileri `localStorage`'da depolama girişimlerini reddederek web sitesinin işlevselliğini kısıtlaması veya meşgul scriptleri sonlandırması gibi önemli yan etkilere sahip olabilir.
|
||
|
||
Sinks:
|
||
```javascript
|
||
requestFileSystem()
|
||
RegExp()
|
||
```
|
||
## Dom Clobbering
|
||
|
||
{{#ref}}
|
||
dom-clobbering.md
|
||
{{#endref}}
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|