SQL Injection Nedir? Nasıl Korunuruz?
SQL INJECTIONSQL Injection, bir veri tabanı güvenliği açığı olarak bilinmektedir.SQL Injection saldırısı ile yetkisiz olarak veri tabanına sızılabilmektedir.SQL Injection, günümüzde halen yaygın olarak kullanılmakta olup, birçok sitede bulunmaktadır.SQL Injection açıkları yazılan SQL kodlardan meydana gelmektedir.Yine bu kodlar dikkatsizlik ve yanlış kodlama sonucu oluşmaktadır.SQL Injection yöntemi ile bir web uygulamanın tüm veri bilgilerini çalabilir, web uygulamayı hacklenebilmektedir.SQL Injection açıkları küçük sitelerden tutun büyük bir firma sitelerine kadar tüm sistemlerde olabilmektedir.SQL Injection açığını hazır sistemlerdede arayabilirsiniz.SQL Injection tam ifadesi Structured Query Language Injection' dur.SQL Injection, açıklarında en önemli etken, m.eta karakterleri oluştururken birden fazla meta karakter yazma sebebi de, SQL Injection açıklarının oluşmasını sağlamaktadır.SQL Injection saldırıları genelde üye giriş alanlarında yapılmaktadır.Eğer üye giriş bilgileri doğru ise başarılı bir şekilde panele erişim sağlayacak.Üye giriş bilgileri yanlış ise, yani veri tabanından kayıt dönmediği zaman tekrardan giriş paneline yönlendirecektir.Örnek bir üye giriş kodunu inceleyelim;<%CSKullaniciadi = Request.Form ("kullaniciadi")CSSifre = Request.Form ("sifre)Set RsLogin = SQLConn.Execute ("SELECT * FROM Uyeler WHEREkullaniciadi = '" & CSKullaniciadi & "' AND sifre = '" & CSSifre & "'" )
If RsLogin.EOF AND RsLogin.BOF ThenResponse.Redirect "/hata.asp"ElseSession("login") = RsLogin("kadi_id")Response.Redirect "../"End If%>
Üye girişi kodumuzda anlatılmak istenen ilk ve ikinci satırımızda "kullaniciadi" ve "sifre" değişkenlerin değerini almaktır.Aşağıdaki kodumuzda SQL veri tabanında bulunup bulunmadığını kontrol etmektedir.Bu sayede veri tabanında kullanıcı bulunuyor ise,başarılı bir şekilde giriş yapıyor.Eğer bulmuyor ise,/hata.asp olarak yazılan sayfaya yönleniyor.Set RsLogin = SQLConn.Execute"("SELECT" FROM Uyeler WHERE kullaniciadi ='" & CSKullaniciadi & "' AND sifre = '" & CSSifre & "'" )Yukarıdaki kodumuzda SQL veri tabanında bulunup bulunmadığını kontrol etmektedir.Bu sayede veri tabanında kullanıcı bulunuyor ise,başarılı bir şekilde giriş yapıyor.Eğer bulamıyor ise /hata.asp olarak yazılan sayfaya yönlenmektedir.Yukarıdaki üye giriş formumuzda SQL Injection denemesi yapılabilir.Bu deneme bypass olarak da adlandırılabilir.Üye giriş panellerinde deneyebileceğiniz bazı kodlar aşağıdaki gibidir." 'CR' 1=1--, 'QR A=A--, "OR 0=0--, OR 0=0 "SQL Injection saldırılarından korunmak için aşağıdaki kodlar yeterli olacaktır.<%Function security (veri)veri = Replace (veri ,"'","",1,-1,1)veri = Replace (veri ,"&","",1,-1,1)veri = Replace (veri ,"%","",1,-",1)veri = Replace (veri ,"=","",1,-1,1)veri = Replace (veri ,"AND","",1,-1,1)veri = Replace (veri ,"/","",1,-1,1)veri = Replace (veri ,\","",1,-1,1)veri = Replace (veri ,"*","",1,-1,1)veri = Replace (veri ,"!","",1,-1,1)security = veriEnd Function%>
Yukarıdaki kodlar örnek kodlardır ve bu kodları sizler tamamen kendinize göre geliştirebilirsiniz.Böylece SQL Injection açığını açığını bir nevi önlemiş olacaksınız.Üye giriş paneliniz bu şekilde daha güvenli olacaktır.Yukarıda eklenen kodları aşağıdaki gibi sayfaya eklemeniz gerekecektir.<%sKadiID = security (Request.Form ("kadiid"))sSifreID = security (Request.Form ("sifreid"))%>
Burada eklediğimiz kod ve değişkenleri düzenlediğimiz zaman üye giriş panelimiz aktif olacaktır.SQL Injection açıkları,bir diğer yönden site sonuna eklenen kodlarla denenmektedir.SQL Injection açığını denemek için site sonuna bazı dorklar getirerek kolayca deneme yapabilirsiniz.
Bazı SQL Injection dorkları aşağıda verilmiştir."inurl:news.php?=id", "inurl:index.php?=id", "inurl:section.php?=id"Yukarıdaki bazı hazır dorklar sayesinde, arama motorlarında bu dorkları aratarak açıklı siteler taranabilmektedir.Bir web uygulaması geliştiriyorsak, bu dorkların oluşmaması için sitemizdeki kodları özenle analiz etmemiz gerekmektedir.Yukarıdaki dorklar genellikle hazır sistemlerde bulunmaktadır.Bir web uygulaması geliştirecek iseniz, hazır sistemleri düzenleme yerine sıfırdan bir web uygulaması geliştirmek, her zaman daha yararlı olacaktır.SQL Injection denemeleri manuel olarak yapılacağı gibi programlarla da yapılabilmektedir.Web uygulaması geliştirmenizde otomatik olarak SQL Injection taraması yapmanızı tavsiye etmekteyim.Bu sayede gözden kaçırmış olduğunuz noktaları,yazmış olduğunuz denetimler sayesinde bularak uyarı verebilir.Böylece kötü niyetli kişiler açığı bulmadan önce siz bulursunuz ve bulduğunuz açığı kapatabilirsiniz.SQL INJECTION GÜVENLİK[LEFT]Bir önceki konuda SQL Injection açıklamasını ve korunma yollarını öğrendik. Bu konumuzda örnek bir SQL Injection oluşturma ve oluşturulan SQL Injection'un nasıl kapatılacağını öğreneceğiz.İlk aşamada web uygulamamızla beraber oluşturduğumuz veri tabanımız için gerekli olan SQL.PHP dosyasını ana dizinimize yüklüyoruz.Bu dosya ile SQL çalışacaktır.Örnek bir SQL.PHP kodumuz aşağıdaki gibidir.$conn = mysql_connect ("localhost", "root", "") ;mysql_select_db("TurkHackTeam", $conn;$sql= "SELECT * FROM people WHERE id= '$_GET [id] ' " ;$result= mysql_query ($sql, $conn) ;while ($row=mysql_fetch_array ($result) ){echo $row ['ad'] . " ";echo $row ['soyad'] . "";}echo "";echo "Sorgu: ".$sql;Yukarıdaki kodu inceleyelim.İlk olarak aşağıdaki koddan başlayalım.$conn = mysql_connect ("localhost", "root", "password") ;Yukarıda yazılan kodun işlevi veri tabanına bağlantının sağlanabilmesi için sunucu ve SQL giriş bilgilerinizin yazılmasıdır.Daha sonra bu bilgiler doğrulandıktan sonra SQL Server üzerinde hangi veri tabanına bağlanması gerektiğini kod ile ayarlamamız gerekecektir.mysql_select_db ("TurkHackTeam", $conn) ;Yukarıda yazılan kod ile bir önceki kod arasındaki bağlantı şu şekildedir:Eğer sunucu bilgilerimiz doğru ise SQL Server'dan TurkHackTeam isimli veri tabanına bağlantı gerçekleşecektir.Bilgilerimiz yanlış ise bağlantı gerçekleşmeyecektir.Bir sonraki kodumuz şöyledir:$sql= "SELECT * FROM uye WHERE id = '$_GET [id]' ";Veri tabanındaki sorguyu hazırlama kodudur.Tablomuzun ismi uye'dir. Bu kod ile tablodan veriler çekilmek üzere sorgu hazırlanacaktır.$result= mysql_query ($sql,$conn) ;Yukarıda yer alan kod ise bir önceki satırda hazırlanan sorgunun çalıştırılması için yazılmıştır.Sorgunun başarılı bir şekilde yapılması için bu kod yazılmıştır.while ($row=mysql_fetch_array ($result) )Yukarıdaki kod ile veriler alınmaktadır.Alınan verilerin gösterilmesi için aşağıdaki kod yazılmıştır.{echo $row ['ad'] . " " ;echo $row ["soyad"] . "";}echo "";echo "Sorgu: ".$sql;Yukarıda örnek bir SQL dosyası oluşturduk.Oluşturmuş olduğumuz bu dosyanın kullanım şekli ise şöyledir.http://www.TurkHackTeam.Net/sql.php?id=23Web site adresinin sonuna ?id=23 yazdık.Bu yazdığımız veri tabanımızda yer alan uye tablosundan 23. değeri önümüze getirecektir.Bu yöntem ile bir SQL Injection açığı açılmış olacaktır.Bu açığı genişletecek olursak ilk başlarda verdiğimiz OR kodları ile daha geniş bir injection yapılabilmektedir.Bu açıktan korunmak için GET ve POST metotlarını ele alacağız.GET VE POST METOTLARI[LEFT]Get ve Post metotlarının bu durumlarda en çok tercih edilen metotlar olduğunu söylemiştik.Bu metotlarda güvenliğimizi GET ve POST metotlarını doğrulayarak sağlayabiliriz.Zararlı karakterleri engelleyerek kullanıcının veriyi tekrardan girmesini sağlayabiliriz.$input="Veriler kontrol edilmektedir.Lütfen bekleyiniz!' " ;if (preg_match ("/[\-] {2,} | [;] | ['] | [\\\*] /", $input) )// $input,değişkeni,zararlı karakterleri kontrol etmesi için oluşturulmuştur.Zararlı karakterler önceden belirlenmiş olmalıdır.Bu karakterler if kod satırında yer almaktadır.
echo "Girmiş olduğunuz veride zararlı karakterler bulunmuştur.Lütfen tekrar deneyiniz.";// echo, komutu ekranda yazı görüntülenmesini sağlamaktadır.Kullanıcılara, bilgi verme amaçlı da kullanılabilmektedirler.Yukarıdaki, satırda zararlı karakter bulunduğunu ekrana yansıtmaktadır.Eğer, zararlı karakter bulunmasaydı else satırı ekrana yansıyacaktı.
elseecho "Tebrikler, başarılı bir şekilde işleminiz yapıldı.";Yukarıda yazdığımız kodu daha iyi anlayabilmemiz için kodlarımızı açıklayalım...$input="Veriler kontrol edilmektedir.Lütfen Bekleyimiz!' ";İlk olarak yukarıdaki kodumuzu inceleyelim.Yukarıdaki kodumuzun görevi kullanıcı veriyi girdiğinden itibaren başlamaktadır.Bu kodumuzda kullanıcı verileri giriyor.Veriler girildikten sonra kullanıcıya bir mesaj yansıtılıyor.Mesaj yansıtıldığı zaman arka planda ise asıl görev yapılıyor.Asıl görev ise, aşağıdaki kodumuzda yer almaktadır.if (preg_match ("/[\-] {2,} | [;] | ['] | [\\\*] /", $input)Yukarıdaki kodumuzda asıl görev burada gerçekleşmektedir.Kullanıcıya mesaj yansıtırken, arka planda çalışan bu kod zararlı karakter girimini denetlemektedir.Zararlı karakter giriminde eğer yukarıdaki kodlardan herhangi biri bulunduğu zaman if-else, yani eğer-değilse yöntemi kullanılarak sağlanmaktadır.Bu yöntemde zararlı karakter bulunuyorsa aşağıdaki kod devreye girecektir.echo "Girmiş olduğunuz veride zararlı karakterler bulunmuştur.Lütfen Tekrar Deneyiniz !Yukarıdaki yazılan kod zararlı bir karakter bulunduğu zaman kullanıcıya aktarılmak ve kullanıcıyı bilgilendirmek için oluşturulan koddur.Bu kodda if (preg_match("/[\-] {2,} | [;] | ['] | [\\\*] /", $input) kısımdaki zararlı karakterlerden herhangi biri bulunuyorsa, yukarıdaki kod ekrana yansıyacaktır.Eğer zararlı karakter bulunmuyor ise, değilse (else) yöntemi kullanılarak aşağıdaki kod ekrana yansıyacaktır.echo "Tebrikler, başarılı bir şekilde işleminiz yapıld.";Yukarıdaki kodun ekrana yansıması için zararlı karakterlerin olmaması gerekmektedir.Zararlı karakterler olmadığı taktirde bu kod görevini yapacaktır.Yukarıdaki kodda bulunan yazılar örnek yazılardır.Siz kullanıcılarınızı bilgilendirmek amacı ile gereksiz olan karakterleri yazmamasını duyurabilirsiniz.Gereksiz olan karakterleri belirtebilirsiniz.Bu ve bunun gibi birçok örneği bulunmaktadır.Bu tür kodlarda kullanılacak en iyi yöntem şartlı dallanma yapıları yöntemi olacaktır.VERİ FİLTRELEME[LEFT]Bu yöntemimizde verileri filtreleyerek bu açıktan korunabiliriz.Bir önceki korunma yöntemine göre bu yöntem, biraz daha gelişmiş bir koruma seçeneğidir.Bir önceki örneğimizde olduğu gibi aynı şekilde kullanıcıdan veri girmesini beklemekteyiz.Kullanıcı veriyi girdikten sonra bu işlem çalışmaktadır.Bu işlemin örnek kodu aşağıdaki gibidir;$input ="23' ; DELETE FROM CHIMAERA";$input=preg_replace ("# [^0-9] #", '', $input);echo $input;Yukarıdaki yöntem ile 0 ve 9 arasında olmayan tüm rakamları siler ve düzenli olarak filtreleme işlemi yapar.Bu sayede güvenliğinizi arttırmış olursunuz.Yukarıdaki yöntemin kodlarını detaylı bir şekilde inceleyelim.İlk iş olarak aşağıdaki kodumuzun incelemesini yapalım.$input ="23' ; DELETO FROM CHIMAERA";Yukarıdaki kodumuz kullanıcıya ekranda çıkacak mesajı belirlemektedir.Yukarıdaki kodumuzun çalışma sırası bir alt kod parçacığının işlevini yapması ile başlayacaktır.Bir sonraki kod ise şöyledir:$input=preg_replace ("#[^0-9]#",'', $input)Yukarıdaki kodumuzda belirtikmek sistenen veri filtreleme kısmının ilk başlarında yazılmıştır.Yukarıdaki kod sayesinde 0 ile 9 arasında olmayan tüm rakamları silmektedir.Silinen rakamlar düzenli olarak filtreleme işleminden geçmektedir.Bu kod görevini tamamladıktan sonra son olarak aşağıdaki kod işlevini yapacaktır.echo $input;Yukarıdaki kod satırı ise; en başta belirtmiş olduğumuz $input="23' ; DELETE FROM Chimaera"; kodu için yazılmıştır.Bu kodlar birbirleriyle bağlantılı kodlardır. echo $input; kodu ile ilk başta bulunan kod ekrana yansıtılacaktır.İlk baştaki kodda bulunan 23 rakamı ekrana yansıyacaktır.YETKİ AYARLARI[LEFT]Bu açıktan korunmak için diğer bir yöntem ise, yetki ayarlarıdır.Yetki ayarlarını düzenli bir biçimde yaparsak, güvenliğimizi önceki seviyeye göre 2 kat daha arttırmış oluruz.Yetki ayarları güvenlik konusunda en önemli etkenlerden birisidir.Kullanıcı seviye yetkisini ve yönetici seviye yetkisinin ayarlamalarını yaparsanız, bu açıktan korunabilirsiniz.
KODLAMA[LEFT]Bir web uygulaması geliştirirken bu açıktan korunmak için bir diğer yöntem kodlama yöntemidir.Bir uygulama geliştirirken, uygulamanın kod bölümünde yazmış olduğumuz kodların analizini iyi bir şekilde yapmamız gerekmektedir.Kodları satır satır debug yaparsak daha sağlıklı olacaktır.İyi bir analiz yapılmadan web uygulaması yayına verilirse, yayına verilen web uygulamanın güvenliği konusunda çok fazla bir şey beklememek gerekir.Bir web uygulaması genel olarak yayına girmeden önce gizli olarka yayınlanmalıdır.Gizli olarak yayınlanan web uygulamasında, online olarak tarama yaparak web uygulamanızda açıkların var olup olmadığını kolay bir şekilde anlayabiliriz.OPTİMİZASYON[LEFT]Bu güvenlik açığından korunmak için web uygulamanızın optimizasyonlarını düzenli olarak yapmalısınız.Düzenli olarak optimizasyon çalışması yapılmadığı taktirde, web uygulamanızın güvenliği zayıflayacaktır.Zayıflayan bir web uygulamasının açıkları, çok kolay bir şekilde kötü niyetli kişiler tarafından tespit edilebilir.Bulunan açıklar istenilen şekilde kullanılabilir.BİLMENİZ GEREKENLER[LEFT]Sql Injection açığından korunmak için neler yapabileceğimizi kodlar ile gösterdik.Şimdi beraber bu konuyu özetleyelim:* Wares yazılımlar kullanmayalım.Hem bu sayede emeğe saygısızlık yapmamış olunur, hem de güvenlik açıkları ile karşı karşıya kalmamış oluruz.* Sitelerimizi düzenli olarak kontrol edelim.Sitelerimizin optimizasyon çalışmasını mutlaka ayda bir kez yapalım.Eğer ki kendimiz müdahale edemiyorsak, mutlaka işin ehli birisinden destek alalım.* Uygulamalarınızı sürekli olarak güncel tutmaya çalışın.Bu sayede uygulamanızın verimi artacağı gibi, yeni çıkan güvenlik açıklarına karşı da önlem almış olursunuz.* Veritabanınız da bilgileri saklarken mutlaka çift katmanlı şifreleme yöntemi kullanın.Bir şifreyi en az iki kız MD5 gibi şifreleme yöntemleriyle şifreleyerek veritabanınızda saklayınız.* Uygulamanızın kodlarını yazıp bitirdikten sonra uygulamanızın kodlarını şifreleyin.Bu sayede diğer kişiler erişim sağlasa bile, bu kodu çözmeleri zaman alacaktır ve siz de bu süre içerisinde durumdan haberdar olup gereken önlemi alabilirsiniz.* Uygulamanızda kullanacağınız GET VE POST metotlarında mutlaka zararlı karakterleri filtreleme yöntemi kullanarak filtreleyin.
0 yorum:
Yorum Gönder