Hoşgeldin Misafir

XSS Nedir? Temel Anlatım ve DVWA Üzerinde Uygulama

Conrado Sol

29 Nis 2026
62 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Bir siteye ismini yazıyorsun ama o kutuya normal bir yazı değil de küçük bir kod parçası bırakıyorsun.

Site bunu fark etmiyor olduğu gibi sayfaya basıyor. Sonra o sayfayı kim açarsa senin bıraktığın kod onun tarayıcısında çalışıyor.

İşte kısaca ve en basit haliyle XSS.

Açılımı Cross-Site Scripting.

Kısaca sitenin kullanıcıdan gelen veriyi kontrol etmeden ekrana basmasından doğan bir açık.

Saldırgan araya kendi JavaScript kodunu sıkıştırıyor o kod da başkasının tarayıcısında çalışıyor.

Neden tehlikeli derseniz o kod aslında ne isterse yapabiliyor. En klasik senaryo kullanıcının oturum bilgisini yani cookiesini çalmak. Cookie site sana "bu kişi zaten giriş yapmış" diyen küçük bir veri. O çalınırsa saldırgan senin hesabına girebiliyor.

Üç temel türü var.

Bir tanesi reflected XSS.

Zararlı kod bir link üzerinden gönderiliyor ve sayfaya yansıyor. Kalıcı değil kullanıcının linke tıklaması gerekiyor.

Bir diğeri stored XSS.

Burada kod sitenin veritabanına kaydediliyor mesela bir yorum alanına. Sayfayı açan herkeste çalışıyor. Kullanıcı hiçbir şeye tıklamıyor sayfayı açması yeterli. Bu yüzden stored genelde daha tehlikeli sayılıyor.

Üçüncüsü DOM-based.

Bu biraz farklı çünkü kod sunucuya hiç gitmiyor. Sayfa zaten senin tarayıcında çalışan bir JavaScript ile kendini güncelliyor mesela adres çubuğundaki bir değeri alıp sayfaya basıyor. Saldırgan o değeri zararlı kodla doldurunca iş yine tarayıcıda dönüyor sunucu bundan haberi bile olmuyor. Reflected ve storedda kod sunucudan geri geliyor DOM-based'de ise baştan sona tarayıcıda.

Reflected ve storedı canlı göreceğiz çünkü ikisini bir arada göstermek türler arası farkı en net anlatan yol.

DVWA diye bir uygulama var. Damn Vulnerable Web Application yani bilerek zafiyetli bırakılmış bir eğitim uygulaması. Kendi bilgisayarında çalışıyor gerçek bir siteye dokunmuyorsun. admin kullanıcısıyla giriyoruz.

1-dvwa-login.png


İçeride güvenlik seviyesini de ayarlayabiliyorsun. Biz "low" seçiyoruz çünkü orada hiçbir filtre yok açığı en net haliyle gösteriyor.

2-dvwa-security-low.png


Önce reflected tarafına bakalım. DVWA menüsünde "XSS (Reflected)" sayfası var. Ekranda "What's your name?" diye bir kutu. Normalde adını yazarsın site de "Hello Conrado Sol" der.

Biz isim yerine şunu yazıyoruz:
Kod:
<script>alert('XSS')</script>

3-reflected-payload-girisi.png


Site bu metni tehlikeli mi diye kontrol etmiyor sayfaya basıyor. Tarayıcı da bunu yazı olarak değil kod olarak görüp çalıştırıyor. Ekranda küçük bir uyarı kutusu.

4-reflected-alert-calisti.png


Bu kutunun çıkması "buraya kod enjekte edilebiliyor" demek. Peki neden çalışıyor derseniz sayfanın kaynağına bakınca görüyoruz. Bizim yazdığımız scr*pt etiketi sayfanın HTMLine olduğu gibi gömülmüş.

5-html-kaynagi-gomulu-scr-pt.png


alert zararsız sadece ispat için. Ama aynı yere gerçek bir zararlı kod da yazılabilir. Mesela isim kutusuna şunu yazsak:
Kod:
<script>alert(document.cookie)</script>

Bu sefer kutuda oturum bilgisi çıkıyor. İşte saldırgan bunu ekrana bastırmak yerine kendi sunucusuna gönderse senin oturumunu çalmış olurdu.

Şimdi stored tarafına geçelim çünkü asıl tehlikeli olan bu.

"XSS (Stored)" sayfasında bir ziyaretçi defteri var. İsim ve mesaj giriyorsun kaydediliyor. Mesaj kutusuna cookie payloadını yazıyoruz.

6-stored-payload-girisi.png


Kaydet dedik. Fark şu artık bu kod veritabanında duruyor. Sayfayı kapatıp tekrar açıyoruz.

7-stored-kalicilik-alert.png


Yine çalışıyor cookie yine ekranda. Kimse linke tıklamadı kimse bir şey yazmadı. Sayfayı açan herkeste otomatik tetikleniyor. Reflected ile stored farkı tam da bu.

Peki bunu geliştirici nasıl engeller derseniz temel kural şu:

Kullanıcıdan gelen hiçbir veriye güvenme.

Ekrana basmadan önce output encoding yap. Yani `<` karakterini `&lt;` gibi görünen ama çalışmayan bir forma çevir. Böylece tarayıcı onu kod değil düz yazı sanıyor. Zaten DVWA'da seviyeyi "medium" veya "high" yapınca bu filtreler devreye giriyor ve payload çalışmıyor.

Bir de Content Security Policy (CSP) diye bir kalkan var. Siteye "sadece şu kaynaklardan gelen scr*pt çalışsın" dedirtiyorsun. Araya sıkıştırılan kod bu kurala takılıyor.

XSS eski bir açık ama hala OWASP listelerinde. Sebebi basit her yeni form her yeni yorum kutusu potansiyel bir giriş noktası. Bir tane bile filtrelenmemiş alan yeter.