ASP.Net Core Projelerinde Güvenlik- Stored XSS
Önceki yazımda ASP.Net Core projelerinde Cross-site scripting attacks (XSS) çeşiti olan Reflected XSS konusu hakkında bilgi vermiştik. Bu yazımda ise Cross Site Scripting ( XSS ) çeşiti olan Stored XSS konusundan bahsedeceğim. Faydalı olması dileğiyle . 🙂

- Stored XSS , XSS güvenlik açıkları içerisinde en zararlı olan güvenlik açığıdır.
- Javascript kodunun veri tabanına veya herhangi bir dosyaya yazılma işlemi olarak bilinir.
- Veri tabanına ya da dosyaya yazıldığı takdirde , browserda her gösterildiğinde eğer A kullanıcının sayfasında gösteriliyorsa A kullanıcısına ait oturum bilgileri çalınır. Veya B kullancısının sayfasında gösteriliyorsa B kullanıcısına ait oturum bilgileri çalınır.
- Bu XSS türüyle beraber milyonlarca kişinin data bilgileri çalınabilir.

- Bir önceki dersteki Reflected XSS saldırı türünde ise sadece o an sayfada olan kişinin oturum bilgileri çalınabilir. Başka bir kullanıcının oturum bilgisi çalınamaz. Ancak Stored XSS saldırı türünde ise javascript dosyasının veri tabanına kaydedilme işlemi olduğu için,bu veri tabanındaki her datayı okup bir web sayfasında göstermek istediğimizde o ilgili javascript kodu çalışacaktır. Bu nedenle çok tehlikeli bir güvenlik açığıdır.
Haydi bir örnek ile pekiştirelim!
- System.IO.File.AppendAllText alanını kullanarak ekrandan girilecek bilgileri dosyaya yazdırma işlemini gerçekleştirebiliriz. Bu işlemi bir veri tabanına da kaydedebilirdik. Ancak şu an test yaptığımız için dosyaya yazdırdık.

- ActionResult içerisinde aşağıdaki gibi kontrol işlemi koyup, dosyanın olup olmadığı kontrol edilir. Bu kontrol için System.IO.File.ReadAllLines metodunu kullanmam gerekir. Eğer dosya var ise, bu dosyayı okuyacağım anlamına gelir.
- Yorumlar artık giriş yapıldığında, dosyaya kaydedilmiş oldu. Eğer XSS açığı var ise Javascript kodu da, oluşturmuş olduğum comment.txt dosyasına yazılmış olacak.
- Ve ben comment.txt dosyasını her okumaya çalıştığımda, saldırganın .js kodu çalışmış olacak. 🙁

- .cshtml sayfamızı da aşağıdaki gibi teste uygun hale getiriyoruz. Ve comment.txt dosyasında kayıtlı olan bilgilerin içerisinde dönüp ekrana yazılabilmesini sağlıyoruz.


- Aşağıdaki alandaki gibi Script Tag’i içerisinde Javascript kodu yazıldığında geçtiğimiz makalede bahsettiğimiz gibi “@item” kullanıldığı için,.NET Core devreye giriyor ve zafiyet önlenmiş oluyor. Ve bu sayede yazılan script çalıştırılmıyor.

- Aşağıdaki alanda @ sayesinde encode işlemi gerçekleştirilmiştir.

- Ancak “@” yerine @Html.Raw kullanmış olsaydım encode işlemi gerçekleştirilmeyecekti. Ve güvenlik zafiyeti ortaya çıkmış olacaktı.


- Yukarıdaki gibi Script’i yazıp, yorumu gönderdim. Sayfayı yenilediğimde aşağıdaki gibi bir uyarı ile karşılacağım. Saldırganın .js kodu benim dosyama kayıt oldu. Şimdi .txt dosyasını her okumaya çalıştığında saldırganın .js kodunu da çalıştırmış olacağım. Malesef ki olanlar oldu 🙁

- Sayfanın her yüklenmesinde cookie bilgilerinin uyarı olarak gelmesini istesem “document.cookie” den yararlanabilirim.

- Bu sayede sayfayı her yenilediğimde, saldırganın iki tane .js kodu çalışmış olacak.

- Comment dosyası aşağıdaki gibi dizine eklenmiştir.

- Girilmiş olan tüm loglar bu .txt dosyasının içerisine eklenmiştir.

https://github.com/KardelRuveyda/ASPNetSecurity kodları Github ‘da oluşturduğum Repository’den inceleyebilisiniz.
Kaynakça
- https://www.udemy.com/course/aspnet-core-security/ ( Fatih Çakıroğlu- ASPNET Core Security)
- https://prashantshakti.wixsite.com/security/post/cross-site-scripting-attack-and-solution