Security Expert Network Editor Login | Register Ekle

root > Yazılım Güvenliği
Asp Web Uygulamaları Güvenliği ! - Yazılım Güvenliği - root \ Cyber-Security
ErkanKESKİN
(Date : 03.05.2009 02:50:13)


Asp Web Uygulamaları Güvenliği !
Merhabalar.

Bu makalemde web uygulamalarındaki yazılımdan kaynaklı hatalar ve çözüm yollarını inceleyeceğiz. Bir projeye başlanırken doğru yerden başlanılmaması,direk kodlamaya geçilmesi, projenin bitirilmesinde acele davranılması ve bunun gibi birçok sebebten ötürü birçok alınması gereken önlem unutulur ve saldırganların sömürebileceği birçok açık meydana gelir. Şimdi Bu hataları ve çözüm yollarını birlikte inceleyelim.

Sql İnjection Saldırıları
Bir yazılımı kodlarken mutlaka database ile veri alışverişi yaparız. Database"de saklanan veriler kimi zaman Admin panel bilgileri olur,kimi zaman kredi kartı bilgileri olur, Projesine göre üyelerin şahsi önemli bilgileride olabilir. Bu bilgiler veritabanında saklı tutulur ve yeri gelince kullanıcılar tarafından kullanılır. Database"den bu verileri çekip kimi zaman Form aracılığı ile post ederek kimi zamanda Üst stringten bilgileri göndererek sayfalar arasında bilgileri taşır ve işlemleri yaparız. Kredi kartı bilgileri her zaman Form"dan post methodu ile sayfalar arası taşınır. Güvenliğini tam anlamı ile sağlayabileceğimiz bir sistem yoktur internette. "En Güvenli Sistem ; Fişi Çekili Sistemdir." Der üstadlar :) Biz elden geldiğince sıkı tutmaya çalışıcaz. İlk olarak birçok server izin vermiyo artık Database in yolunu adres çubuğuna yazarak download etmeye ama biz yinede önlemi alalım ve database"imizi iyi saklayalım. Mesela şu şekilde bir yol olabilir.

d/b/sdasdkssss/ylik/skskl/skmng.mdb

Boşuna bakmayın bir anlamı yok yazdığım yolun. Klavyeden salladım :) Deneme yanılma yöntemi ile bulunamayacak bir yol olması yeterli. Kaldıki dediğim gibi bulunsada bu zamanda birçok serverda işlemiyor ya... olsun biz önlemimizi alalım. Bunun dışında verileri database" e kaydettirirken Formdan aldığımızı far<edersek verilerimizi mutlaka html kod yazımını engelleyelim. Eğer bir text editörle işimiz yoksa tabiki. Bu bahsettiğim bir sipariş formu olsun ve veriler database"de depolansın. Öyle ise formdan veriyi çekerken öncelikle şunu yapalım.

<%
Dim KartNo

KartNo = Server.HtmlEncode(Request.Form("KartNo"))

%>

Şimdi Foprmdan gelen veriyi Text olarak okuttuk. Hiçbir şekilde kod olarak algılanamaz duruma getirdik. Birde düşünürsek kartno numeric bir değerdir. Şu şekilde de Numara girilmişse Hata verdirebiliriz.

<%
If IsNumeric(KartNo) = False Then " // Kart Numarası Numeric bir değer değil ise

Response.Write "Girdiğiniz Değer Formata Uygun Değildir."

End If
%>

Şeklinde KartNo Textboxuna Sayısal Değer Girimini Zorunlu Tutuyoruz.

Bunun Dışında Sql Komutlarından Korunmak içinde Bir fonksiyon yazabiliriz. Ataklarda kullanılabilecek Muhtemel Sql sorgu komutlarını Replace ederek bertaraf etmeliyiz.

<%
"// Öcelikle Fonksiyonumuzu Yazalım.

Function SQLKorumasi (deger)

deger = Replace(deger,"<","")
deger = Replace(deger,">","")
deger = Replace(deger,""","")
deger = Replace(deger,"or","")
deger = Replace(deger,"And","")

deger = SqlKorumasi

End Function

"// Burada <,>,",or,And Gibi Karakterleri Boşluk ile değiştirdik.
"// Veriyi Çekerkende

KartNo = SQLKorumasi(Request.Form("KartNo"))
%>

Şeklinde çekersek Bu Fonksiyonumuzu Bu TextBox"a uygulamış oluruz.

Ayrıca MD5 İle kriptolayıp Database"e kaydettirmeliyiz. Bu VB Scriptin bir fonksiyonudur. Her serverda Dll"i bulunur. Rahatlıkla kullanabilirsiniz.

Aynı Fonksiyon Kullanımında Olduğu Gibi. Şimdi Request.Form Methodu için gördüklerimizi Tek Seferde kullanalım.

<%
Dim KartNo

KartNo = IsNumeric(SQLKorumasi(Server.HTMLEncode(MD%("KartNo"))))
%>

Bu şekilde Çekip Kullanırsakta Hepsini bir arada uygulamış oluruz ki oldukça güvenli görünüyor. Hiç bir zaman tam manası ile güvenli diyemeyiz. Bu nedenle ubu kelimeyi kullanmıyorum.

Bu Request.Form methodu için bir iki önlemdi. Şimdi ise Request.QueryString methodu için bir iki önlemden Bahsedelim. Diyelimki Üst Stringten bir Id gönderiyoruz. Genelde Kart No ve Admin Password Username gibi verileri taşırken form methodu kullanılır. Kimse üst string Kullanmaz Fakat önlem olarak izahını yapalım biz.

Id Databse"deki otomatik sayıdır. Genelde her tabloda bir id değeri bulunur. Bu otomatik olarak arttığı için kayıtların birbiri ile karışmasını önler. Her kayıt eklendiğinde birer birer artar. Her kayıda ayrı bir numara verir. Bir sayfadan diğerine Link yolu ile gidilecekse ve gidilen sayfada Databse"den bir kayıda atıfta bulunulacaksa Bu id ile atıfta bulunulur. İlhili kaydın İlk sayfada Id değeri Kayıt seti açılarak alınır ve Link ile diğer bir sayfaya taşınıp tekrar bir recordset ile Id sorgulatılıp ilgili kayıdın bulundugu diğer alanlarına atıfta bulunulur sayfa içinde kullanmak için. Bu Id değerini çekerken IsNumeric ile sayısal veri olup olmadığını ilk olarak kontrol ettirmeliyiz. Gelen değerde boşluk olmadığını varsa bile Trim Fonksiyonu sayesinde bu boşluğu alarak kontrol etmeliyiz. Hatta gönderilen Id değeri dışında üst stringe herhangi bir Id yazılmasını dahi engellemeliyiz ve Server nesnelerimizden Server.Variables("http_referer") ile direkt olarak link yazımını engellemeliyiz. Örneklerimizi Yapalım.

<%

Set Gonder = Baglanti.ExeCute("Select * From tblAdi Where Id")

Response.Write("<a href=""git.asp"">Id Yolla</a>")

%>

İlk sayfadan git.asp sayfasına Id değerini yolladık. Bu tabloda birde içerik alanı oldugunu varsayalım ve git.asp de içeriği okutmak istiyoruz. git.asp"de aşağıda ki kodlar olacak.

<%
Id = Trim(IsNumeric(Request.QueryString("Id")))

Set Rs = Baglantim.ExeCute("Select * From tblAdi Where Id=""& Id &""")

If Server.Variables("http_referer") = "" Then

Response.Write("Yasak bir şekilde bu sayfaya geldiniz.")
Response.Write("<br><br><a href=""javascript:history.back();""")

ElseIf Rs.Eof And Rs.Bof Then

Response.Write("Gelen Değer hatalı.")
Response.Write("<br><br><a href=""javascript:history.back();""")
Else

Do While Not Rs.Eof
Response.Write Rs("icerik")
Rs.MoveNext:Loop
End If
%>

Gerekli Güvenlik önlemlerini almış bulunmaktayız. Trim ile Boşluk Kontrolü Yaptık. IsNumeric İle Sayımı Değilmi kontrolü yaptık. Server nesnemiz aracılığı ile İlk sayfadaki linke tıklanmışmı yoksa direkt olarak adres çubuğundan veri girişi yapılarakmı bu sayfaya gelinmiş kontrol ettik ve hatamızı verdirdik ve son olarakta gelen Id veritabanımızda var mı yokmu Linke tıklanan Id değeri dışında başka bir verimi geliyo kontrol ettirdik ve bunların dışında ise yani temizse içeriği okuttuk. Bu tarz önlemleri her yazılımcı alır elbet fakat kodlanan projenin büyüklüğü ve ekibin yeterliliğine bağlı olarak bunlar unutulabiliyor. Proje büyük oluyor fakat o projede acele ediliyorsa bunlar unutulur. Yazılımcının ustalığı sadece kodlamadan ibaret ise bunlar unutulur. Kişilik bir proje ekibinin ancak altından kalkabileceği bir proje ise ve bu projeyi tek kişi kodluyorsa bunlar unutulabilir. Zaten yöntemler basit fakat her yazılımcı bu hatalara yukarıda saydığım sebeblerden ötürü düşebilir. Projeye başlanmadan önce ilk olarak Uygulama beyinde oluşturulup iyi bir storyboard çıkarılıp, proje kağıda dökülüp ekip ile iş bölümü yapıldıktan sonra kodlamaya geçilmesi en sağlıklı olanıdır. Tek kişi kodlanacaksada Bu adımların uygulanması profesyonelce olanıdır. Ayrıca yukarıda anlattığım hatalara düşmemek için Bir iki teknik bilgi daha verecek olursak. Include methodunu sık olarak kullanalım. Bu bize hem zamandan kazandırır hemde kafa karışıklığı önlenmiş olur. Örneğin Değişken tanımlamalarımızı tek bir sayfada yapıp her sayfaya include ile çağıralım. Ayrıca Option Explicit kullanarak Dim ile tanımlanmamış değişken kullanımını yasaklayalım ki Belki kullanacağımız yüzlerce değişkeni birbirine karıştırmaktan kurtulalım. Fonksiyonlarımızıda tek bir sayfada yazıp her sayfaya include ettirelim. Include methodunu kullanmayı abartırsak projemizdeki kodlarımıza bir nevi labirent özelliği katmış oluruz ve İleride projenin sayfaları bir hacker"ın eline geçse bile en azından oldukça canını sıkarız. Nasıl Olabilir mesela Değişken tanımlamalarımızı yaptığımız sayfayı bir sayfaya include edelim. O sayfayıda herhangi bir sayfaya include edelim. 7-8 adet include işlemi ile yabancı birinin epey kafasını karıştıracak hale gelmiş olur sanırım. 7-8 adet include işleminden sonra asıl kullanacağımız sayfaya çağıralım. Bu sayede Saldırgan bu sayfayı bulmak istese bile epey zorlanacaktır. Labirent yöntemi inatçı biri için etkili değildir elbet ama azda olsa caydırıcı bir etken olabilir.Son olarak Her kodumuza " ile açıklama satırları ekleyelim. Bu projemizi daha sonraları gerek düzeltmeler gerek eklentiler kodlamaları için tekrar açınca Hangi kodu hangi amaçla yazdığımızı karıştırmamız açısından önemlidir. Sonraki makalede görüşmek dileğiyle.

Saygılarımla

Erkan KESKİN



Derecelendir
Kaynak ErkanKESKİN Tarafından yazılmış/derlenmiştir.
İçerik İhbarı
Bağlantılar Bg.org.tr

CS - Security Expert Network AUP&TOS