Makale Özeti

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.

Makale

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