16 Ekim 2017

Anti XSS Kütüphanesi ile XSS Saldırılarından Korunma

Anti XSS kütüphanesi .NET platformunda bulunan XSS zafiyetlerini önlemek için oluşturulmuş bir kütüphanedir. Bu kütüphane aracılığıyla  XSS payloadları encode edilerek sunucuya gönderilir.

XSS (Cross Site Scripting) hakkında bilgi sahibi olmak için daha önce yazmış olduğumuz makaleye buraya tıklayarak göz atabilirsiniz.

Anti XSS kütüphanesini anlamak ve kullanımını pekiştirmek için küçük bir uygulama yapacağız, uygulamamızı Visual Studio kullanarak C# dilinde yazacağız.



Projemize XSS_Sayfa1 ve XSS_Sayfa2 olarak 2 adet web form ekliyoruz .


Amacımız sayfa1’deki input alanına yazdıklarımızı sayfa2 ye post etmek.




Sayfa1’e 1 adet textbox ve request işlemimizi yapması için 1 adet buton ekliyoruz.


Kod kısmına gelerek XSS_Class adında bir class ekliyoruz (Sayfa2’ye göndereceğimiz değeri classta tutacağız.)

public class XSS
        {
            public static string XSSPayload;
        }

Butonun click eventine gelerek aşağıdaki kodları yazıyoruz. Textboxa yazılan değeri XSS class’ının XSSPayload özelliğine atıyoruz, sonrasında XSS_Sayfa2.aspx sayfasına yönlendirilmesini sağlıyoruz.

       protected void btnReq_Click(object sender, EventArgs e)
        {
            XSS.XSSPayload = txtXSS.Text;
            Response.Redirect("AntiXSS2.aspx");
        }


XSS_Sayfa2’ye gelerek Page_Load eventinde çalışmasını istediğimiz kod satırlarını yazıyoruz. (Oluşturduğumuz Class’daki XSSPayload özelliğini ekrana yazdırıyoruz.)

protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(AntiXSS.XSS_Class.XSSPayload);
        }


Uygulamamızı çalıştırıyoruz.

XSS_Sayfa1.aspx’de 1 adet textbox ve 1 adet buton bulunmakta textbox’a standart olarak kullandığımız xss payloadını yazıp gönder butonuna basıyoruz.


Karşımıza bir hata çıkıyor ve xss payloadımız engelleniyor. Ama biz kontrol koymadık nasıl yaptı bunu ?

ASP.NET platformunda geliştirilen yazılımlarda inputlara yazılan ‘<’ işareti ile başlayıp ‘>’ işareti ile biten script tag’leri otomatik olarak varmı yokmu diye kontrol edilir eğer varsa ekrana bu şekilde hata fırlatır. Bunu ASP.NET otomatik olarak kontrol eder.

Hata sayfalarının kullanıcılara gösterilmesi uygulama açısından kritik bilgilerin gösterilebileceği anlamına gelebilir. Bu gibi hata sayfalarının engellenmesi gerekmektedir.

Birçok yazılımcı hata sayfalarını düzeltmek için internette bulduğu çözümü ne gibi sorunlara neden olacağını tahmin edemeyebilir. Hata sayfasının görüntülenmesini engellemek tek satır kod ile mümkündür.
 
Hata sayfasının çözümü olarak Web.config’e yazılacak kod aşağıdaki gibidir.

<pages validateRequest="false"/>


Bu kodu yazdıktan sonra biraz önceki yaptığımız isteği tekrar yapalım.
Sonuç olarak karşımıza hata sayfası çıkmadı ama yazdığımız xss payloadı çalışmış oldu.


Web.config’de yapılan değişiklikler tüm uygulamayı kapsar, ancak bu kontrolü sadece belirli sayfalarda ve belirli inputlarda kapatmakta mümkündür.

aspx sayfasının en üstünde bulunan Page Language ile başlayan satırın içine ValidateRequest="false" yazılırsa validasyon kontrollerinin bu sayfada yapılmayacağı anlamına gelir, yani diğer sayfalarda kontrol devam edecektir.  Aynı şekilde Hangi input için bu kontrolün yapılmasını istemiyorsak ValidateRequestMode="Disabled" yazarakda bu kontrolü o input için kapatmış oluruz.


Şuana kadar hatanın çözümü için yöntemlerden bahsettik, hatanın üretilmesini engelledik ama XSS zafiyetini engelleyemedik tam bu sırada Anti XSS kütüphanesi karşımıza çıkıyor ve bu kütüphane sayesinde XSS zaafiyetinden de korunmuş oluyoruz.

Gerekli kütüphaneyi projemizde kullanacağımız sayfaya ekliyoruz.

using System.Web.Security.AntiXss;

AntiXssEncoder sınıfındaki HtmlEncode özelliğini kullanıyoruz.

Response.Write(AntiXssEncoder.HtmlEncode(AntiXSS.XSS_Class.XSSPayload,false));


Aynı isteği tekrar yaptığımızda sayfanın bize alert üretmediğini görmüş olduk yazdığımız xss payloadını olduğu gibi bize gösterdi, Yani XSS zafiyetini AntiXss kütüphanesi sayesinde önlemiş olduk.
Input Encode


Output Encode