LYK — Web Uygulama Güvenliği ve Güvenli Kod Geliştirme (6.gün)

Hatice Ergün
Jul 28, 2017 · 3 min read

Bir önceki yazı için tıklayın.

Anlatacağım zafiyet türlerini denemek için izinli siteleri kullanın. Aksi halde suç işlemiş olursunuz. Bugcrowd sitesi (https://www.bugcrowd.com/bug-bounty-list/) hangi sitelerin izin verdiğinin listesini barındırıyor. Buradaki sitelerde bir zafiyet bulup bildirdiğiniz takdirde bazıları ödeme yapıyor. Burada ismi bulunmayan sitelere yaptığınız her deneme suçtur. Alıştırma yapmak ve öğrenmek için XSS game (https://xss-game.appspot.com/) sitesini deneyin. Netsparker (http://php.testsparker.com/process.php?file=Generics/index.nsp) tarafından hazırlanmış sitede size alıştırma yapma imkanı sunuyor.

Zafiyet türlerini ikiye ayırabiliriz.

DOM Based ve Text Based

  • Reflected
  • Stored
  • Blind

Reflected (Kalıcı Olmayan): Saldırganın inputdan girdiği kod veri tabanına kaydedilmez sadece tek seferlik tarayıcıda görünür.
Stored (Kalıcı olan): İnputdan girilen veri bir kez veritabanına kaydolur ve tarayıcıda görünür.

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="xxxxxx" 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.

XSS Saldırılarından Nasıl Korunabiliriz?

Kullanıcıdan alınan veriler, XSS için tehlikeli olan işaretleri html encode olarak çeviren htmlspecialchars fonksiyonuna alınabilir. Burada tüm karakterler encode edilmez, tüm kodları encode etmek daha güvenlidir. Bunun için htmlentities kullanılır.
Kullanıcıdan alınan veri asla script içine alınmamalıdır.
Mutlaka input validation yapılmalıdır.

White list

izin verilen karakter, kelime ya da sayıları belirleyerek bunlara izin verilmesine ve geride kalan hiçbir şeyi kabul etmeme yaklaşımına white list denir.

Black list

İzin verilmeyecekleri belirleyip geri kalan her şeyi girdi olarak kabul etmek black list yapmaktır.

Bu şekilde bir yaklaşımla kontrol yapamadığımız girdiler olabilir. Telefon numaralarını düşünelim yada e posta girdi formatlarını. Bunun gibi girdilere belli bir biçimde izin verilmesi gerekiyor. Bunu RegEx kuralları belirleyerek yapabiliriz. Bunun için https://regex101.com/ sitesine göz atabilirsiniz.

Bir sonraki yazı için tıklayın.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade