ASP SQL Injection Engelleme
Cuma, Aralık 11, 2009 0:26
Merhaba arkadaşlar. Bu yazımda ASP ile kodlanmış sitemizde SQL Injection denen ataktan korunmayı anlatacağım. Eğer ASP biliyorsanız bu yazıyı çok basit bir şekilde anlayacaksınız ve uygulayacağınızı tahmin ediyorum. Çünkü neler olabileceğinide şimdi anlatıcam.
Nedir SQL Injection;
Her SQL cümleciği ile dinamik bir veri giriş, çıkışı olur. Fakat aşağıdaki uygulamayı yapmadığımız taktirde özel karakterler (‘), (;) büyük bir sorun yaratacaktır. Tek tırnak ayrı string, noktalı virgül satırın bittiğini belirtir.
Nasıl Uygulanır?
Burada asıl anlatılan yazı hack olmadığı için bu konuya ayrıntılı girmeyeceğim. Kodların mantığını anlamak için nasıl yapıldığını anlatıcam. Örneğin QueryString(“id”) stringinden veri alıyoruz. sayfa.asp?id=10. Burada anlatmak istediğimiz 10 id’li veriyi çekiyoruz. Fakat biz bunu sayfa.asp?id=10′ yazdığımızda hata veriyorsa iş karışıyor demektir. Yani bir SQL açığı bırakmış olabiliriz.
Burada veri çekmek için kullandığımız kod: select id from sayfa where id = “&request.querystring(“id”)&” şeklinde olacağından büyük bir tehlike var demektir.
Nasıl Korunuruz?
Burada asıl amaç SQL cümleciği için kullanılan tehlikeli karakterleri silmek veya replace etmektir. Onun için fonksiyonumuz;
<%
‘ Fonksiyonumuz buradan başlıyor.
Function inject(Str)
Str = Replace(Str, “*”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “=”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “<”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “>”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “;”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “(“, “[YASAK]“,1,-1,1)
Str = Replace(Str, “)”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “+”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “#”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “‘”, “[YASAK]“, 1, -1, 1)
Str = Replace(Str, “&”, “[YASAK]“, 1, -1, 1)
Str = Replace(Str, “%”, “[YASAK]“, 1, -1, 1)
Str = Replace(Str, “?”, “[YASAK]“, 1, -1, 1)
Str = Replace(Str, “´”, “[YASAK]“, 1, -1, 1)
Str = Replace(Str, “,”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “UNION”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “SELECT”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “WHERE”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “LIKE”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “FROM”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “UPDATE”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “INSERT”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “ORDER”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “GROUP”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “ALTER”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “ADD”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “MODIFY”, “[YASAK]“,1,-1,1)
Str = Replace(Str, “RENAME”, “[YASAK]“,1,-1,1)
Str = Replace(Str, Chr(39), “[YASAK]“, 1, -1, 1)
If InStr(1,Str,”[YASAK]“,1) then
Response.Redirect “Default.asp” ‘ Yönlenmesini istediğimiz adres
end if
inject = Str
End Function
%>
Evet bu fonksiyonu komple alıp kullanabilirsiniz. Fonksiyon adına dikkat edin. (Kalın yazılı yer) Veri çekerken o fonksiyondan geçireceğiz. Şimdi veri çekme kodumuzuda şu şekilde değiştirelim;
<%
…
strID = inject(request.querystring(“id”)) ‘ strID değişkenine fonksiyondan geçen verimizi aldık
…. Select id from sayfa where id = “&strID&” ‘ Veri çekerken değişken ile aldık
…
%>
Böylece zararlı kodlar id mizde bulunursa default.asp adresine yönlenecek…