Cross Site Scripting (XSS) Zafiyeti
Kullanıcıdan alınan girdileri filtrelemeden kullanıcıya sunulması sonucu oluşan zafiyetlerdir. Yazılımcı aldığı verileri hiç bir işleme sokmadan kullanıcıya sunar. Bu durumda saldırgan bazı js kodları yazarak sitemize zarar verebilir.
Şöyle bir senaryo ile konuyu somutlaştıralım.
Yazılımcı aldığı veriyi hiçbir şekilde filtrelemeden mi kaydediyor bunu kontrol etmek için girdi olarak; “xxxxx’ < > / \( ) ; : -” bunu girmiş olalım. Şimdi girdiyi gönderelim ve sayfa kaynağını görüntüleyelim. Alınan girdi nerede tutuluyor bakalım. Ctrl+f ile girdimizi bulalım. Sayfa kaynağında hangi karakterler engellenmiş bunu tespit edelim. Engelli olmayan karakterlere göre payload kodu kurup saldırı yapmaya çalışacağız.
Yazılımcı kullanıcıdan aldığı verileri dört farklı yerde alabilir. Alınan veri için {$} bu gösterimi kullanalım.
<title> {$} </title>
<meta content= "{$}">
<h1> {$} </h1>
<script> {$} </script>
- Alınan girdi script içinde kullanılıyorsa, saldırgan amacına ulaşmak için kod yazdığında hiçbir önlemle karşılaşmadan saldırı yapabilir.
- Alınan girdi value değeri olarak kullanılıyorsa, saldırgan value içinden çıkmak için “> karakterlerini girerek script açabilir ve dilediği kodu çalıştırabilir.
- Script çalıştıramadığı durumda img ile onerror verdirerek saldırabilir.
Deneyeceğimiz kodlarda alert verdirmeye çalışacağız. XSS var mı, kod çalıştırabiliyor muyuz amacımız bunu görmek. Zarar verecek kod yazmayacağız. Alert() ekrana pop-up çıkarmayı sağlar. Sisteme girebildiğimizi en kolay bu şekilde görebiliriz. Alert dışında, prompt ve confirm de kullanabiliriz. Alert engellenmiş ise bunları kullanabiliriz.
query = self.request.get('query', '[empty]')
message = "Sorry, no results were found for <b>" + query + "</b>."
message += " <a href='?'>Try again</a>."
Yukarıdaki kod alınan veriyi hiç bir şekilde kontrol etmeden mesaj olarak ekrana basıyor. Dolayısıyla istenen input için <script>alert(1)</script>
yazarsak alert verdiğini görürüz.
Başka bir örnek verelim.
Alınan girdi kod kısmında ...value="{$}">
buraya ekleniyor olsun. Burada girdinin bulunduğu yerden çıkmak için öncelikle ">
karakterlerini yazdıktan sonra script açıp kod yazabiliriz.
"><script>alert(1)</script>
ya da "><img src="xxxxxxx" oneror="alert(1);">
img ile xxxxxx diye bir adres çağırıyoruz böyle bir adres olmadığı için oneror çalışıyor. Bu sayede yine XSS zafiyetini kullanabiliyoruz.
Hangi yöntemi kullanacağımız, nasıl bir kod parçasıyla içeri girebileceğimiz tamamıyla kod yapısına ve karakterlerin hangilerinin engellendiği ile alakalıdır.