22 KiB
Raw Blame History

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üvenli olmayan 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.

Tip

Kaynaklar ve sinkler için daha güncel bir listeyi https://github.com/wisec/domxsswiki/wiki bulabilirsiniz.

Yaygın kaynaklar:

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:

ık Yönlendirme Javascript Enjeksiyonu DOM-veri manipülasyonu 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 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 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 someDOMElement.innerHTML jQuery.parseHTML()
jQuery.globalEval() someDOMElement.href someDOMElement.outerHTML $.parseHTML()
$.globalEval() someDOMElement.src someDOMElement.insertAdjacentHTML İstemci tarafı JSON enjeksiyonu
``HTML5-depolama manipülasyonu someDOMElement.action someDOMElement.onevent JSON.parse()
sessionStorage.setItem() XPath enjeksiyonu 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
requestFileSystem() ``Belge-alan manipülasyonu document.implementation.createHTMLDocument() document.cookie
RegExp() document.domain history.pushState() WebSocket-URL zehirlenmesi
İstemci Tarafı SQL Enjeksiyonu Web-mesaj manipülasyonu history.replaceState() WebSocket
executeSql() postMessage() `` ``

innerHTML sıvısı, modern tarayıcılarda script öğelerini kabul etmez ve svg onload olayları tetiklenmez. Bu, img veya iframe gibi alternatif öğeler kullanmanız gerektiği anlamına gelir.

Bu tür bir XSS muhtemelen bulunması 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

Örnekler

ık Yönlendirme

Kaynak: 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 meydana gelir.

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:

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 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'nin site içinde kullanılması durumunda 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:

document.cookie

JavaScript Enjeksiyonu

From: 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:

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

Document-domain manipulation vulnerabilities bir script'in document.domain özelliğini bir saldırganın kontrol edebileceği verilerle ayarlaması durumunda ortaya çıkar.

document.domain özelliği, tarayıcılar tarafından aynı köken politikasının 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ı engelleyen istisnalar vardır. Genellikle, tarayıcılar çocuk veya ebeveyn alanlarının kullanılmasına izin verir.

Sinks:

document.domain

WebSocket-URL zehirlenmesi

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

WebSocket-URL zehirlenmesi, bir script'in 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

DOM tabanlı bağlantı manipülasyonu güvenlik açıkları, bir script'in saldırgan tarafından kontrol edilebilir 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:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax isteği manipülasyonu

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

Ajax isteği manipülasyonu güvenlik açıkları, bir script'in saldırgan tarafından kontrol edilebilen verileri bir Ajax isteğine yazdığı durumlarda ortaya çıkar ve bu istek bir XmlHttpRequest nesnesi kullanılarak yapılır.

Sinks:

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

Yerel dosya yolu manipülasyonu zafiyetleri, bir script'in saldırgan tarafından kontrol edilebilen 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:

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

İstemci tarafı SQL enjeksiyonu zafiyetleri, bir scriptin saldırgan tarafından kontrol edilebilen verileri güvensiz bir şekilde istemci tarafı SQL sorgusuna dahil etmesi durumunda meydana gelir.

Sinks:

executeSql()

HTML5-storage manipulation

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

HTML5-storage manipulation zafiyetleri, bir script'in saldırgan kontrolündeki 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:

sessionStorage.setItem()
localStorage.setItem()

XPath enjeksiyonu

From: 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:

document.evaluate()
someDOMElement.evaluate()

İstemci tarafı JSON enjeksiyonu

From: 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, JSON veri yapısı olarak ayrıştırılan bir dizeye dahil etmesi ve ardından uygulama tarafından işlenmesi durumunda meydana gelir.

Sinks:

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

Web-message manipulation

From: 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. Zayıf Web-message manipülasyonu örneği PortSwigger'in Web Security Academy 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

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:

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

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 ırı miktarda CPU veya disk alanı tüketmesine neden olabilecek API'leri içerir. Bu tür zafiyetler, tarayıcının localStorage'da veri depolama girişimlerini reddederek veya meşgul scriptleri sonlandırarak web sitesinin işlevselliğini kısıtlaması gibi önemli yan etkilere sahip olabilir.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

{{#ref}} dom-clobbering.md {{#endref}}

{{#include ../../banners/hacktricks-training.md}}