Merhaba arkadaşlar, bu ayki nasıl yapılır köşesinde sizlere Sql Aşılama (Sql Injection) nedir ve nasıl yapılır hakkında elimden geldiğince bilgi aktarmaya çalışacağım. Konumuza başlamadan önce ufak bir giriş yapalım Sql’e.
Sql nedir?
“Structured Query Language” yani “Yapılandırılmış Sorgu Dili” anlamındadır. İlişkisel Veritabanı Yönetim Sistemleri (Relational Database Management System, RDBMS) veritabanlarında işlem yapabilmek için kullanılan bir yazılımdır. Sql bir dildir ancak bir proglama dili değildir. Programlama geliştirme aşamasında Sql’den yararlanılabilir; fakat tek başına Sql proglama için yeterli değildir. Sql ile bir veritabanından kayıtları alabilir, değiştirebilir, yeni kayıtlar ekleyebilir veya var olan kayıtları silebiliriz. Kısacası Sql, bir veritabanında veri saklamak ve istenilen vakitte ona ulaşmak için gerekli yoldur.
Şimdi konumuza giriş yapalım. Sql aşılama web uygulamalarındaki en ciddi açıklardan biri olarak görülebilir. Özellikle frameworkler ve Object Relational Mapping (ORM) gibi ekstra veritabanı katmanlarının popüler hale gelmesi ile bu tür açıklıklar azalsa da hala bulunmaktadır. Sql aşılama veritabanından ve dilden bağımsız olarak her türlü uygulama-veritabanı ilişkisine sahip bir sistemde bulunabilir, ki bu da veritabanlarının bir açığı değildir. Sql aşılamadan korunmak web geliştiricisinin görevidir.
Sql Aşılama Nedir?
Sql aşılama, Sql sorgularının arasına dışarıdan müdahalede bulunma, veri ekleme işleminin genel adıdır. Web uygulamalarında kullanıcılar tarafından girilen veriler ile dinamik Sql cümleleri oluşturulur. Bu cümleler oluşturulurken araya giren herhangi bir meta-karakter Sql aşılamaya neden olabilir. Meta-karakter; bir program için özel anlam ifade eden karakterlere verilen addır. Mesela JAVA'daki “\” bir meta-karakterdir ve derleyici ya da yorumlayıcı bu karakteri gördüğü vakit ondan sonra gelen karakteri bu meta-karaktere göre işler. Sql için ise meta-karakter “ ‘ ” (tek tırnak) ve “ ; ”(noktalı virgül) dür. Şimdi bir Sql aşılama nasıl yapılır onu görelim.
SQL Aşılama (injection) Nasıl Yapılır?
Mesela bir foruma veya e-posta kutunuza giriş yapacaksınız. Kullanıcı adı ve şifrenizi girdiniz. Verileri girdikten sonra “SELECT * FROM UYELER WHERE kullanıcı_adi = ‘Baris’ AND sifre = ‘pamuk’ ” şekline benzer bir Sql cümlesi oluşturulur. Eğer veritabanında böyle bir kayıt varsa Sql cümlesi o kaydı döndürür ve girişiniz sağlanır. Eğer kayıt yoksa tekrar giriş ana sayfasına yönlendirilirsiniz. Aşağıdaki örnek bir koda bakalım:
Kullanici_adi = Request.Form(“username”)
Sifre = Request.Form(“password”)
Set RsLogin = SQLConn.Execute(“select * from Uyeler where username =
‘ “ & Kullanici_adi & ” ’ and password = ‘ “ & Sifre & ” ’ ”)
İf RsLogin.EOF and RsLogin.BOF then Response.Redirect “/error.asp”
else Oturum(“login”) = RsLogin(“kullanici_no”)
Response.Redirect ”../”
end if
Yukarıdaki örnek kod klasik bir oturum açma şeklidir. Bu örneğe basit bir sql aşılama deneyelim ve neler olabilir görelim.
Öncelikle Kullanici_adi yerine “ ‘ or 1 = 1 ” , Sifre yerine ise “ ‘ or 1 = 1 ” girelim. Ve bakıyoruz ki siteye girmisiz. Aaa :) Neden ve nasıl diye sormak çok doğal. Şimdi koda bakalım ve nasıl olduğunu hep beraber inceleyelim. Girdiğimiz değerleri kodda yerlerine koyarsak karşımıza şu şekilde bir kod çıkar.·
Select * from Uyeler where username = ‘ ‘ or 4 = 4 ’ and password = ‘ ‘or 4 = 4 ’
Sizlerin de farkettiği gibi bu Sql cümlesi şu şekilde yorumlanacaktır. Uyeler tablosundan kullanici_adi alanı boş olanlar ve Sifre alanı boş olanları getir veya 4 eşittir 4 getir. Bu Sql cümlesi her zaman doğru dönecek ve Uyeler tablosundan tüm üyeleri listeleyecektir. Çünkü ilk kontrole bakmaksızın son kontrol(4 eşittir 4 kontrolü) her zaman doğru sonuç verecek ve Sql cümlesi çalışıp, Uyeler tablosundan tüm üyeler listelenecektir. Böylece dönen kayıtlardaki ilk kullanici olarak giriş yapmış bulunmaktasınız. Görüldüğü gibi Sql aşılama; Sql cümlelerinin arasına dışarıdan müdahale yapılmasına imkan sağlayıp Sql’i istediğiniz şekilde değiştirmenize izin verir.·
Sql aşılamanın temel nedenlerinden birisi web uygulamalarının kullanıcılardan aldığı verileri kontrol etmeden, gerekli filtreleme işlemini yapmadan verileri direk alıp Sql cümlesi oluşturmasıdır. Bu açık yakalandığında müdahalede bulunmak için “ ‘ ” (tek tırnak) karakteri ile girdiye başlanır ve bunun sonucunda Sql’e istenilen komutu göndermek için tek tırnak yardımıyla string bölümünden kaçınılır. Bunun gibi veya daha farklı yollardan müdahalede bulunulursa istenmeyen kişiler tarafından ulaşılmasını istemediğimiz veriler ele geçirilebilir. Buna izin vermemek için yapmamız gereken iki ana kural vardır.
- Tüm meta-karakterlerden kaçınılmalıdır.
- Sayısal olarak beklenen girdilerin sayısal olup olmadığı kontrol edilmelidir.
Tek tırnak olayından kaçınmak için art arda iki kez tek tırnak işareti konulmalıdır, ki Sql bunun tek tırnak karakteri olduğunu anlasın. Bunun dışında ufak tefek yöntemler de vardır; ancak en genel yöntemler yukarıda listenenlerdir.
Evet değerli e-bergi okuyucuları sizlere elimden geldiği kadar Sql aşılama hakkında bilgi aktardım. Sql aşılamanın ne demek olduğu, nasıl yapıldığı ve buna karşı nasıl korunmak gerektiğini kısaca özetledim. Umarım işinize yarar. Hepinize e-bergili mutlu günler.