Bilginin Adresi Ana Sayfa
Forum Anasayfası Forum Anasayfası > Bilgisayar Güvenliği / Computer Security > Güvenlik / Security Makaleleri
  Aktif Konular Aktif Konular RSS - Asp (Sql Injection Ve Korunma)
  SSS SSS  Forumu Ara   Events   Kayıt Ol Kayıt Ol  GiriÅŸ GiriÅŸ

Asp (Sql Injection Ve Korunma)

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
megabros Açılır Kutu Gör
Security Professional
Security Professional
Simge

Kayıt Tarihi: 08-06-2009
Konum: Turkey
Status: Aktif DeÄŸil
Points: 752
Mesaj Seçenekleri Mesaj Seçenekleri   Thanks (0) Thanks(0)   Alıntı megabros Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: Asp (Sql Injection Ve Korunma)
    Gönderim Zamanı: 23-08-2009 Saat 22:55

Eminimki bir çoğunuzun sql injection hakkında azda olsa bilgisi vardır.

Sql injection`u sql server`ın meta karakteri olan (`) meydana getiriyordu.Sql server`da bundan etkilenmemek için tek tırnak yerine ” kullanmamız gerekiyor.

Bu yazımızda sql servera tek tırnağı çift tırnak gibi algılamasını sağlatacak fonksiyonu yazacağız.Bu sayede güvelik açığımız kalmayacak.

Tabiki bundan önce en önemli güvenlik zaaflarından biri olan blacklisting yöntemini anlatacağım.

Blacklisting = kara liste yöntemi

Yani bir takım sql cümleciklerini kara listeye ekleyerek çalışmalarını engelliyoruz.

Bu yöntem sql injection`u engelleme de en büyük zaafları oluşturur (xss içinde blacklisting vardır ve O da aynı şekilde güvenlik zaafıdır)

Öncelikle en basit şekilde yazılmış üyelik sistemimizi inceleyelim.

Yazıyı daha iyi anlamanız açısından üyelik sistemini biraz açıklayalım :

Giriş yapıp içeriğini görüntülemek istediğimiz sayfa olan sayac.asp

<body><html>
<!–#include file=”ayar.asp”–>
<center><table border=”0″ width=”100%” cellpadding=”0″ style=”border-collapse: collapse” height=”99″>

<%
IF Not Session (”girdinmihocam”) = “evetgirdim” Then
%>

<form action=”giris.asp” method=”post”>
<tr><td><p align=”right”>&nbsp;Kullanıcı adı : </td>
<td>&nbsp;<input type=”text” name=”kullanici” size=”20″></td></tr>

<tr><td><p align=”right”>&nbsp;Parola : </td>

<td>&nbsp;<input type=”text” name=”parola” size=”20″></td></tr>

<tr><td><p aling=”right”>&nbsp;</td>

<td>&nbsp;<input type=”submit” value=”Giriş”></td></tr></form>

<%
Else
%>

<tr><td>&nbsp;</td><td>Hoşgeldiniz</td></tr>

<center><tr><td>& ; ; ;nbsp;</td><td>
<p align=”center”>&nbsp;<a href=”logout.asp” style=”text-decoration: none”>

<font color=”#FF0000″>Oturumu Kapat</font></a></td></center>

<%
END IF
%>
</table></center></body></html>

İnclude ettiğimiz ayar.asp :
<%
Set baglanti = Server.Createobject(”ADODB.Connection”)
baglanti.open “Provider=Microsoft.Jet.Oledb.4.0;Data Source=” & Server.MapPath(”uyelik.mdb”)
%>

Üyelik.mdb içinde üyeler adında bir tablomuz var.5 adet sütundan oluşuyor.id – kullanıcı – parola – giris_tarihi ve onay

Giris.asp sayfamız
<!– #include file=”ayar.asp” –>
<%
kullanici = Request.Form(”kullanici”)
parola = Request.Form(”parola”)
If kullanici=”" or parola=”" Then
Response.Write “Lütfen boş alan bırakmayın !”
Response.End
END IF
sql=”Select * From uyeler Where onay=1 and kullanici = `”& kullanici &”` and parola = `” &parola& “`”
Set Kontrol = Baglanti.ExeCute(sql)
IF Kontrol.eof Then
Response.Write “Böyle bir kullanıcı yok be gülüm”
Else
Session (”girdinmihocam”) = “evetgirdim”
Session (”id”) = Kontrol(”id”)
Session (”kullanici”) = Kontrol(”kullanici”)
Response.Redirect “../fentanyl/index/index.asp”
END IF
%>

Şimdi gelelim asıl mevzuya.

Sayac.asp sayfasını çağırdığızda karşınıza kullanıcı adı – parola soran sayfa geliyor.

Buraya normalde admin-admin yazarak giriş yaparız ve index.asp`ye yönleniriz.Daha sonra geri dönüp sayfayı yenilediğimizde sayac.asp`ye giris yapmış oluruz.

(Bu kendi kodladığım bişey. Böyle bi saçmalığa gerek yok aslında :)

Boş alan bırakarak giriş yapmaya çalışınca `Lütfen boş alan bırakmayın` hatası alıyoruz.Peki bunu sağlayan kodlar neler?

KodIf kullanici=”" or parola=”" Then
Response.Write “Lütfen boş alan bırakmayın !”
Response.End
END IF

Eğer kullanici değeri boş bir değere eşitse `lütfen boş bırakmayın` yazdırıyoruz ve response.end komutuyla komutu durduruyoruz. End if ile şart cümleciğimizi kapatıyoruz.

Bu mantıkla biz bir blacklisting yapabiliriz.

Eğer kullanıcı=x ise `lütfen sql deneme` gibi bir mantıkla bunu uygulayacağız.

Çok bilindik sql cümleciklerinden biri olan `OR` ile giriş yapmayı deneyelim.
Kullanıcı adı ve şifre değeri yerine bunu yazınca giriş yapmış oluyoruz. Demekki üyelik sistemimiz bu cümleciğe karşı bir zaaf taşıyor.
Bunu engellemek için daha doğrusu engellediğini düşünenlerin en çok düştüğü hata tek tek cümlecikleri üyelik sistemine tanıtmak.

Örnek :

KodIf kullanici=”`OR`” or parola=”`OR`” Then
Response.Write “Lütfen sql denemeyin !”
Response.End
END IF

Bu iki kod parçasını sayfanıza eklediğizde artık `OR` kodu ile giriş yapılamayacak.

Peki bu güvenlimi ? Diyelimki bütün bilindik sql kodlarını tek tek blacklisting yaptınız güvende olduğunuzu düşünüyorsunuz peki sizi hacklemeye düşünen kişi ya sizden biraz farklı düşünüyorsa ???
`OR` bu kod ile giriş yapamıyoruz peki (`OR`   ) parantez içindeki kod ? Sonuna eklediğim boşluklar dahil bunu kullanıcı adı ve parola alanına aynen yazıyoruz. Tabiki parantez işaretleri hariç.

Denediğiniz zaman bu kod ile gayet güzel bir şekilde giriş yapıldığını göreceksiniz. Hadi diyelim bu ihtimalide düşünüp bunuda engellediniz. Peki aşağıda parantez içinde vereceğim kodların hepsini nasıl engelleyebilirsiniz ? Kodun sonundaki boşluk sayısı değiştikçe sizin yaptığınız blacklisting çuvallıyor.

(`OR`   )
(`OR`    )
(`OR`     )
(`OR`      )

yaptığım şey sadece boşluk sayısını arttırmak.Her koyduğum boşluk için yeni bir sql açığı meydana geliyor.
Demekki blacklisting uygulaması aslında büyük bir güvenlik zaafıymış.
Şimdi aklınızdan `Peki ben giris.asp içinde boşluk karakteri yazılmasını engellersem?` diye düşünebilirsiniz.

Tamam hadi sizi kırmayalım ve boşluk karakterini de engelleyelim. Peki sizce bütün bilindik sql cümleciklerini engelleyebilir misiniz?

`OR`
`or
`or“`
““or“or`

Tamamen kafanızdan türetebileceğiniz zilyar tane sql cümleciği var :)
Bu verdiğim cümleciklerin tamamı bu yazıyı yazarken kendi deneyerek 2-3 sn`de bulduğum şeyler. Sizde kafadan deneme yanılma ile sql kodları bularak bu tip basit üyelik sistemlerini aşabilirsiniz.

Demekki ne olursa olsun üyelik sistemimizi blacklisting uygulamalarına emanet etmeyeceğiz.

Peki ne yapmalıyız ? Tek tırnak ile çift tırnağı değiştirecek bir fonksiyon bizim işimizi görür ;)

<%
function guvenlik(degistir)
degistir = replace(degistir,chr(13),”")
degistir = replace(degistir,chr(34),”")
degistir = replace(degistir,chr(39),”")
degistir = replace(degistir,”,”,”")
degistir = replace(degistir,”/”,”")
degistir = replace(degistir,”\”,”")
degistir = replace(degistir,”?”,”")
degistir = replace(degistir,”*”,”")
degistir = replace(degistir,”‘”,”")
degistir = replace(degistir,”OR”,”")
degistir = replace(degistir,”AND”,”")
degistir = replace(degistir,”%”,”")
degistir = replace(degistir,”&”,”")
degistir = replace(degistir,”<”,”")
degistir = replace(degistir,”$”,”")
degistir = replace(degistir,”>”,”")
degistir = replace(degistir,”=”,”")
degistir = replace(degistir,”!”,”")
degistir = replace(degistir,”–”,”")
degistir = replace(degistir,”#”,”")
degistir = replace(degistir,”like”,”")
degistir = replace(degistir,”drop”,”")
degistir = replace(degistir,”create”,”")
degistir = replace(degistir,”modify”,”")
degistir = replace(degistir,”rename”,”")
degistir = replace(degistir,”alter”,”")
degistir = replace(degistir,”cast”,”")
degistir = replace(degistir,”join”,”")
degistir = replace(degistir,”union”,”")
degistir = replace(degistir,”where”,”")
degistir = replace(degistir,”insert”,”")
degistir = replace(degistir,”delete”,”")
degistir = replace(degistir,”update”,”")
guvenlik = degistir
end function
%>

Bu kod parçası sıradan bir güvenlik sistemidir fakat ilk aşamada bizim işimizi görür. Giriş yapılan paneldeki form’u denetleyen kod parçasıdır

Saygılar..
Yukarı Dön
kral Açılır Kutu Gör
Administrator
Administrator


Kayıt Tarihi: 08-03-2006
Status: Aktif DeÄŸil
Points: 957
Mesaj Seçenekleri Mesaj Seçenekleri   Thanks (0) Thanks(0)   Alıntı kral Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 23-08-2009 Saat 23:04
Teşekkürler  bir örnekte ben ekleyeyim
 
<%
Function security(Filtre )

security = Filtre

security = Replace(security, "<", "<" )
security = Replace(security, ">", ">" )
security = Replace(security, "^", "-" )
security = Replace(security, vbcrlf, "<br>" )
security = Replace(security, "script", "script", 1, -1, 0 )
security = Replace(security, "SCRIPT", "SCRIPT", 1, -1, 0 )
security = Replace(security, "Script", "Script", 1, -1, 0 )
security = Replace(security, "script", "Script", 1, -1, 1 )
security = Replace(security, "object", "object", 1, -1, 0 )
security = Replace(security, "OBJECT", "OBJECT", 1, -1, 0 )
security = Replace(security, "Object", "Object", 1, -1, 0 )
security = Replace(security, "object", "Object", 1, -1, 1 )
security = Replace(security, "applet", "applet", 1, -1, 0 )
security = Replace(security, "APPLET", "APPLET", 1, -1, 0 )
security = Replace(security, "Applet", "Applet", 1, -1, 0 )
security = Replace(security, "applet", "Applet", 1, -1, 1 )
security = Replace(security, "embed", "embed", 1, -1, 0 )
security = Replace(security, "EMBED", "EMBED", 1, -1, 0 )
security = Replace(security, "Embed", "Embed", 1, -1, 0 )
security = Replace(security, "embed", "Embed", 1, -1, 1 )
security = Replace(security, "event", "event", 1, -1, 0 )
security = Replace(security, "EVENT", "EVENT", 1, -1, 0 )
security = Replace(security, "Event", "Event", 1, -1, 0 )
security = Replace(security, "event", "Event", 1, -1, 1 )
security = Replace(security, "document", "document", 1, -1, 0 )
security = Replace(security, "DOCUMENT", "DOCUMENT", 1, -1, 0 )
security = Replace(security, "Document", "Document", 1, -1, 0 )
security = Replace(security, "document", "Document", 1, -1, 1 )
security = Replace(security, "cookie", "cookie", 1, -1, 0 )
security = Replace(security, "COOKIE", "COOKIE", 1, -1, 0 )
security = Replace(security, "Cookie", "Cookie", 1, -1, 0 )
security = Replace(security, "cookie", "Cookie", 1, -1, 1 )
security = Replace(security, "form", "form", 1, -1, 0 )
security = Replace(security, "FORM", "FORM", 1, -1, 0 )
security = Replace(security, "Form", "Form", 1, -1, 0 )
security = Replace(security, "form", "Form", 1, -1, 1 )
security = Replace(security, "on", "on", 1, -1, 0 )
security = Replace(security, "ON", "ON", 1, -1, 0 )
security = Replace(security, "On", "On", 1, -1, 0 )
security = Replace(security, "on", "on", 1, -1, 1 )
security = Replace(security, "or", "or", 1, -1, 0 )
security = Replace(security, "OR", "OR", 1, -1, 0 )
security = Replace(security, "Or", "Or", 1, -1, 0 )
security = Replace(security, "or", "or", 1, -1, 1 )
security = Replace(security, "document.cookie", "Document.cookie", 1, -1, 1 )
security = Replace(security, "javascript:", "javascript ", 1, -1, 1 )
security = Replace(security, "vbscript:", "vbscript ", 1, -1, 1 )
security = Replace(security, "SELECT", "Select ", 1, -1, 1 )
security = Replace(security, "DROP", "Drop ", 1, -1, 1 )
security = Replace(security, ";", "; ", 1, -1, 1 )
security = Replace(security, "--", "-- ", 1, -1, 1 )
security = Replace(security, "INSERT", "Insert ", 1, -1, 1 )
security = Replace(security, "DELETE", "Delete ", 1, -1, 1 )
security = Replace(security, "xp_", "xp_ ", 1, -1, 1 )
security = Replace(security, "UNION", "Union ", 1, -1, 1 )
security = Replace(security, "'", "`" )

End Function
%>
“Bilginin elde edilmesi... bizi iyiye ulaştıracaktır.
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör



Bu Sayfa 0.188 Saniyede Yüklendi.