ASP.Net Core Projelerinde Güvenlik- Reflected XSS

Önceki yazımda ASP.Net Core projelerinde Cross-site scripting attacks (XSS) konusuna giriş yapmıştık. Bu yazımda ise Cross Site Scripting ( XSS ) çeşiti olan Reflected XSS konusundan bahsedeceğim. Faydalı olması dileğiyle . :)

  • Reflected XSS anlık olarak yapılan bir saldırıdır. Kullanıcının web sitesinde anlık olarak javascript kodu çalıştırması ile gerçekleşir
  • XSS türleri içerisinde en az hasarı Reflected XSS verir. O anda hangi kullanıcının oturum bilgisi varsa o oturum bilgisi çalınır. Başka kullanıcıların Cookie bilgisi gibi değerler çalınamaz.
  • Test işlemlerinizi gerçekleştirebilmek için bir ASP.NET Core projesi oluşturmanız gerekmektedir.
  • ASP.Net Core projenizi oluştururken , otomatik alanların geleceği Model,View Controller şablonunu seçebilirsiniz. Buradaki amacımız zafiyet senaryosunu oluşturabilmek.
  • Aşağıdaki gibi HomeController içerisine aşağıdaki ActionResult’ları oluşturmanız gerekir.
  • Dikkat ederseniz kullanıcıdan almış olunan veriler hiçbir validasyon yapılmadan Viewbag’e eklenmiş gözüküyor. Bu bilgiler .cshtml tarafında yazılacak.
  • Kullanıcıdan alınan data direk olarak cshtml tarafına tarafına gönderiliyor. XSS zafiyeti de tam bu noktada ortaya çıkıyor.Bu zafiyetin çıkmasını istemiyorsak, alınan datayı validasyona sokmamız gerekirdi.
  • CommentAdd metodumuzdan bir de Viewbag oluşturalım. Viewbag kodu da aşağıdaki gibidir.
  • Yukarıda yazmış olduğumuz kod aslında aşağıdaki gibi bir görüntü çıkartıyor. Bu görüntüde iki textbox alanına yazdığımız veriler aşağıdaki gibi yorumlar kısmının altına basılmaktadır.
  • @ ile değişken yazdırıldığında razor tarafında, bir değişken default olarak .NET Core mimarisi ile veriyi otomatik olarak encode eder. Eğer buradaki datanın içerisinde büyük küçük işareti gibi değer varsa, bu değer .NET Core mimarisi de gelen güvenlik önlemleri ile karşı karşıya kalır. Yazılan zararlı kodlar, zararsıza dönüştürülüp aşağıdaki gibi ekrana yazdırılır.

Yukarıdaki gibi otomatik olarak encode işlemi gerçekleşti. Browser bu kodu okurken encode ettiği için, zararlı kod zararsız koda dönüştürüldü ve ekrana yazdırıldı.

XSS açığı hangi durumda devreye girer ?

  • @Html.Raw(Viewbag.comment) şeklinde kullanım gerçekleştirilirse XSS kural açığına maruz kalınabilir.
  • Bu raw metodu içerisinde string ifade verilirse, .NET Core’daki güvenlik önlemleri devreye giremez ve verilen HTML data doğrudan ne istendiyse o şekilde ekrana yazdırılır.
  • Aşağıda görüldüğü üzere, amaç <b></b> tagları arasında bir string değer verilmiştir. Amaç buradaki kısmın ekrana kalın punto ile yazılmasını sağlamaktır. @Html.Raw kullanıldığı için , .NET Core güvenlik işlemi devreye girmemiştir. Ve encode işlemi olmadığı için, verilen HTML kodunun yaptığı işlem direk ekrana yazılmıştır.
  • Aynı işlem Javascript kodunda da yapılmıştır. Aşağıda gördüğünü üzere textbox içerisine yazılmış olan Javascript alert kodu çalışmıştır.
  • Şimdi de şöyle bir senaryo düşünelim. Gerçekten bir saldırganın web sitemizdeki cookie bilgilerini çalacağını düşünerek yola çıkalım. Controller içerisinde ActionResult kısmımızda email ve password bilgilerimizi otomatik olarak dolduralım.
  • Yukarıdaki gibi tanımladığımızda Network alanında görüyoruz ki email ve password kısımlarında tanımlamış olduğumuz veriler Cookie kısmında geldi.
  • Javascript kodumuza aşağıdaki gibi “document.cookie” ifadesini yazıp çalıştırırsak, alert ekranında bize kullanıcının email ve password bilgisini basacaktır.
  • Hacker bu bilgilerimizi imaj oluşturarak başka bir servera da gönderebilir. Zaten en tehlikeli kısmı budur.
  • Yeni bir imaj nesnesi oluşturulduktan sonra bu imaj nesnenin içerisinde tamamen random bir domain verilip bu domaine bir de querystring gönderilir. Peki querystring olarak ne gönderilecek ? Bu kısımda document.cookie kullanılarak kullanıcının email ve password bilgileri gönderilecek.
  • İstek yapılmaya çalışıldığında ise javascript kodu işlenirken Image nesnesi oluştuktan sonra SRC’de data okunmaya çalışılır. Ve imaj nesnesi olduğunu düşünür. Ancak burada sunucuya data gönderme işlemi vardır.
  • Aşağıdaki gibi bu bilgilerin gönderildiği bilgisini Network’den görebilirsiniz. Bu örnekte böyle bir domain bilgisi olmadığı için 404 almıştır. Gerçek bir domain olsaydı, bu domaine bilgiler gönderilecekti.
  • Eğer örnek verilen server dinlenseydi ve log tutulsaydı bu web sitesindeki cookie bilgileri loglanmış olacaktı.
  • Rich textbox kullanacaksanız XSS zafiyetinden korunmak için Server tarafında gelen datayı temizlemeniz gerekmektedir.
  • Bunun için extra bir kod yazmanıza gerek yok,
  • Html Sanitizer Repository’sini inceleyebilirsiniz.

Bir sonraki yazıda Stored XSS’den bahsedeceğim. Görüşmek üzere :)

https://github.com/KardelRuveyda/ASPNetSecurity kodları Github ‘da oluşturduğum Repository’den inceleyebilisiniz.

Kaynakça

Software Specialist— @Kariyer.NET

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store