WUG-SYH #2 : Kara Listeleme
Web uygulamalarında en sık karşılaştığım problemlerden, problem olmasa da yanlış pratiklerden, birisi de blacklisting (kara listeleme) mantığıdır.
Teori & Laf Salatası
Blacklisting dediğimiz olayın pratiğini günlük hayatta pek çok yerde görebiliriz. Örneğin markete giderken genellikle ihtiyaçlarımızın listesini daha önceden bir kağıda yazmamız ve markette sadece bu ürünleri alıp çıkmamız tavsiye edilir. Sebebi ise açıktır, marketteki bir ton ürünü görüp ihtiyacımız olmasa bile almayı engellemek içindir.
Web uygulaması güvenliğinde de olay tam olarak böyle olmasa bile buna yakındır. Kullanıcıdan alınan girdinin, tanımladığımız doğru girdi tanımı ile birebir örtüşmesi gerekir. Bunun dışında kalan durumları ise tamamen reddetmeliyiz. Bu mantığa kısaca whitelisting deniyor.
Kötü pratik olarak geçen şey ise ; önümüzdeki bir market dolusu maldan işimize yaramayanların bir kısmını listeleyip geri kalanların hepsini almaya benziyor. Pratik olarak işinize yaramayacak olanların hepsini listelemeniz pek mümkün değil, düşünmediğiniz bir ton case çıkacak ve sonunda ister istemez işinize yaramayacak bir ton şeyi satın almış olacaksınız.
Bu olumlu ama yetersiz yaklaşıma ise blacklisting deniyor. Nitekim gelen kötü inputların hepsini ayıklayamadığınız için her türlü girdi manipülasyonu oyununa karşı korumasız kalıyorsunuz.
Gerçek Hayat İmplementasyonları
Bir çok web uygulamasında alınan parametrenin filtrelenmesi aşamasında blacklisting yapıldığını görüyorum.
Örneğin karşımda bir arama scripti var, "foo" katarını aratıyorum ve karşıma
Bu noktada ilk akla gelen şüphesiz ki SQL Injection ve XSS. Ben burada örneğe XSS üzerinden devam edeceğim.
Burada XSS testi yapmak isteyenler hemen en genel XSS payload'u olan <script>alert(1)</script> gibi bir şeyi deneyecektir. Dönen sonuç sayfası :
Ortalama bir saldırganın bu noktada deneyeceği şey :
Peki Çözüm Nedir ?
Görüldüğü üzere her türlü blacklisting filtresini geçmenin bir yolu bulunabilir. Çözüm ise gayet açık, yazının daha başında bahsettiğim whitelisting bakış açısı. Yani sadece olması gerektiği gibi girdiyi tanımlayıp, bu tanımla örtüşenleri kabul edip, gerisini reddetmek.
Ekstra Okuma & Referans
Cross Site Scripting Blacklist Protection
Unusual XSS Vectors
Teori & Laf Salatası
Blacklisting dediğimiz olayın pratiğini günlük hayatta pek çok yerde görebiliriz. Örneğin markete giderken genellikle ihtiyaçlarımızın listesini daha önceden bir kağıda yazmamız ve markette sadece bu ürünleri alıp çıkmamız tavsiye edilir. Sebebi ise açıktır, marketteki bir ton ürünü görüp ihtiyacımız olmasa bile almayı engellemek içindir.
Web uygulaması güvenliğinde de olay tam olarak böyle olmasa bile buna yakındır. Kullanıcıdan alınan girdinin, tanımladığımız doğru girdi tanımı ile birebir örtüşmesi gerekir. Bunun dışında kalan durumları ise tamamen reddetmeliyiz. Bu mantığa kısaca whitelisting deniyor.
Kötü pratik olarak geçen şey ise ; önümüzdeki bir market dolusu maldan işimize yaramayanların bir kısmını listeleyip geri kalanların hepsini almaya benziyor. Pratik olarak işinize yaramayacak olanların hepsini listelemeniz pek mümkün değil, düşünmediğiniz bir ton case çıkacak ve sonunda ister istemez işinize yaramayacak bir ton şeyi satın almış olacaksınız.
Bu olumlu ama yetersiz yaklaşıma ise blacklisting deniyor. Nitekim gelen kötü inputların hepsini ayıklayamadığınız için her türlü girdi manipülasyonu oyununa karşı korumasız kalıyorsunuz.
Gerçek Hayat İmplementasyonları
Bir çok web uygulamasında alınan parametrenin filtrelenmesi aşamasında blacklisting yapıldığını görüyorum.
Örneğin karşımda bir arama scripti var, "foo" katarını aratıyorum ve karşıma
şeklinde bir sonuç sayfası dönüyor.
'foo' aratıldı dönen sonuçlar :
Bu noktada ilk akla gelen şüphesiz ki SQL Injection ve XSS. Ben burada örneğe XSS üzerinden devam edeceğim.
Burada XSS testi yapmak isteyenler hemen en genel XSS payload'u olan <script>alert(1)</script> gibi bir şeyi deneyecektir. Dönen sonuç sayfası :
Hissedeceğiniz üzere arka planda çalışan kodda <script> tag'i filtreleniyor. Yani karşı tarafta bir kara liste var, ve gönderdiğiniz input kara listede varsa filtrelenecek, yoksa sessiz sedasız atağınızı gerçekleştireceksiniz.
'alert(1)' aratıldı dönen sonuçlar :
Ortalama bir saldırganın bu noktada deneyeceği şey :
olacaktır. Bu noktada kara listenizde image tagı bulunmuyorsa atak yine başarıyla gerçekleşecek. <p> tagında bile XSS yapılabiliyorken kara listeleme mantığı tamamen zayıf ve yetersiz kalmaktadır.
<image src="" on error="alert(/XSS/)>
Peki Çözüm Nedir ?
Görüldüğü üzere her türlü blacklisting filtresini geçmenin bir yolu bulunabilir. Çözüm ise gayet açık, yazının daha başında bahsettiğim whitelisting bakış açısı. Yani sadece olması gerektiği gibi girdiyi tanımlayıp, bu tanımla örtüşenleri kabul edip, gerisini reddetmek.
Ekstra Okuma & Referans
Cross Site Scripting Blacklist Protection
Unusual XSS Vectors