SQL Injection’tan Korunma’nın Yolları

Ağustos 10, 2011

Merhaba arkadaşlar bugünkü yazımda gerek web sitesi yaparken olsun gerekse windows projelerimizde en çok oluşan güvenlik açığı hiç şüpesizki Sql Injection açığıdır.Peki bu sql injection nasıl yapılır ve nasıl önlem alınır.Genel olarak bu açık sadece web sitelerinde oluşuyormuş gibi düşünmek çok yanlış olacaktır.Bu açığın oluşmasının sebebi sql kodları olduğu için kodunuzu hangi platformda yazarsanız yazın bu platformlar web , win. veya mobile olabilir dikkatli olmazsanız eğer sql injection açığı verebilirsiniz.Şimdi bir web app. ve win app. ‘de sql injection nasıl yapılıyor inceleyelim.MsSql 2008 de veri tabanımızı oluşturalım :

 

 

 

 

Guvenlik adında veri tabanımızı oluşturuyoruz içine bir tane Kullanicilar adında tablomuzu açıyoruz ve bu tablonun içide 3 tane alan oluşturuyoruz kullnanıcıdan sadece kullanıcı adı ve şifre alıp kontrol yapacagımız için 2 tane alan oluşturduk ve bu şekilde veri tabanımızı kaydediyoruz.Hem win app. uygulamamızdan hemde web app. uygulamamızdan bu veri tabanına bağlanıp işlem yapıcaz.İlk olarak web app. de sql injection açığının nasıl olduğunu inceleyelim.Visual Studio ‘ da boş  1 tane web application oluşturuyoruz.

 

 

Web uygulamamızında adına Guvenlik diyoruz ve içine 3 tane web sayfası oluşturuyoruz.Bunlardan ilki default.aspx sayfasında kullanıcının adını ve şifresini alıp kontrol yapıcaz eğer bilgiler tutarsa dogru.aspx sayfasına bilgiler tutmazsa yanlis.aspx sayfasına yönlendiricez.Şimdi default.aspx sayfamıza bakalım.

 

 

default.aspx sayfamızda sadece 2 tabe TextBox ve 1 tane de kontrol yapmak amaçlı buton’umuz var.TextBox’lardan aldığımız bilgileri veri tabanı ile karşılaştırıp kullanıcıyı yönlendiricez.Kontrolü yapıcak kodlarımızı buton’umuzun içine yazmaya başlayalım.Tabi bu kodlar sql injection saldırılarına açık bir şekilde yazılmıştır konunun daha iyi anlaşılabilmesi için :

 

 

using kısmına gerekli sınıflarımızıda ekledikten sonra buton içindeki kodlarımızı yazalım.

 

 

Veri tabanımıza bağlandıktan sonra SqlCommand kısmında yazdığımız sql kodlarımız ile veri tabanında giriş yapmaya çalışan kullanıcı sistemde kayıtlımı diye sorgulama işlemi yapıyoruz daha sonra bu sorgu sonucunu DataTable nesnemize aktarıyoruz ve en alttaki if kontrolü sayesinde dt.Rows.Count ile DataTable ‘ mizde kullanıcı mevcutmu diye kontrol ettiriyoruz.Dikkat edersiniz yukarıdaki sorgumuzu direkt kullanıcıdan aldığımız bilgilere göre oluşturduğumuz için bu sorgudan bize kullanıcı varsa 1 satır geri döner yok ise hiç satır dönmez bu yüzden if kontrolünde Rows.Count değeri 1 ‘ e eşitmi diye kontrol ettiyoruz eğer satır sayısı 1 ‘ e eşitse bu kullanıcı veri tabanında var demektir bunun için işl olarak doğru.aspx sayfamıza yönlendiriyoruz eğer if kontrolünden geçemez ise yanlis.aspx sayfamıza yönlendiriyoruz.Şimdiye kadar yaptıklarımız ile sayfamızı çalıştıralım ve kontrol edelim.Sayfamızı çalıştırmadan önce veri tabanımıza 1 tane kayıt girelim.

 

 

veri girişi yaptıktan sonra default.aspx sayfamızı çalıitıralım ve kontrol edelim.

 

 

İlk olarak doğru kullanıcı adı ve şifre giriyorum ve giriş tuşuna basarak kontrol ediyoruz.

 

 

Bilgilerimizi doğru girdiğimiz için dogru.aspx sayfasına yönlendirildik şimdide bilgilerimizi yanlış girelim.

 

 

Bilgilerimizi yanlış girince doğal olarak bizi yanlis.aspx sayfasına yönlendirdi peki bu şekilde sağlıklı çalışan kodlarada sql injection açığı nasıl oluşuyor şimdi default.aspx sayfamızı tekrardan çalıştıralım ve kullanıcı adı ve şifre kısımlarına sql injection yapmamıza yarayan kodlarımızı yazalım kod diyorum çünkü TextBox’lara yazacağımız mantıksal olarak bizim sorgumuzdaki sql cümlesine yani buton’umuzun arkasında çalışan koda direkt müdahele edip sonucu değiştirecektir.

 

 

Kullanıcı adı ve şifre kısımlarına ‘ or ”=’  yazıyoruz ve Giriş buton’umuza basıyoruz sonrada kendi yazdığımız kodların nasıl hatalı olduğunu düşünmeye başlıyoruz :) )

 

 

Arkadaşlar burada oluşan hatayı anlayabilmek sql yazım dilini iyi bir şekilde kavramaktan geçer çünkü : bizim TextBox’ lara yazdığımız ‘ or ”=’ ifadesi aslında bizim kullanıcı adımızı ve şifremizi belirtmiyor arka taraftaki sorgumuzda bunun nedenide sql ‘in bazı karakterleri özel olarak kabul etmesidir.Biz kullanıcı adı ve şifre kısmına ‘ or ”=’  yazdığımızda buton’un arkasında çalışan kodlarımız sql çümlesini aslında eşittir(=)  ifadesi eşittir(=)  ifadesine eşitmi diye kontrol ediyor bu kontrolden eşittir sonucu çıktığı için de geriye 1 değeri dönüyor if kontrolümüzde bizi bu yüzden dogru.aspx sayfasına yönlendiriyor. Tek tırnak ‘   ifadesi sql için özel anlam ifade etmektedir onun için bunu kullanırken dikkat etmek gerekmektedir.Şimdi vs. uygulamamızda bir tanede win app. oluşturalım ve aynı açığı oradada işleyelim.Aynı projemizin içine 1 tanede win app. oluşturalım

 

 

Kontrol adında bir tane win app. oluşturalım ve Kontrol projemize sağ tıklayıp Set as StartUp Project diyelim bunu uygulamanın ilk olarak başlaması için yaptık yapmasaydık çalıştır tuşuna bastığımız zaman web app. çalışacaktı.Daha sonra form tasarımızı yapalım :

 

 

Kullanıcı Kontrol butonumuz kullanıcıdan aldığı kullanıcı adı ve şifreyi veri tabanında varmı yokmu diye kontrol edip bize bunu mesaj olarak belirticek bunun için ilk olarak using kısmına gerekli sınıflarımızı ekleyelim.

 

 

Şimdi kullanıcı kontrol butonuzun arkasındaki kodlarımızı yazalım :

 

 

Gördüğünüz gibi buradada yazdığımız kodlar neredeyse web app. de yazdıklarımızla bir kaç nokta dışında aynı win app. dada kullanıcı adı kısmına gokhan şifre kısmına 1234 yazarsanız size Giriş başarılı mesajını verdiğinizi görürsünüz onun için ben burada konunun uzamaması için direkt sql injection oluşturan kodları textBox ‘ lara yazıyorum ve buton’ a basılyorum :

 

 

Gördüğünüz gibi win app. veya web app. fark etmeksizin sql injection açıkları veriyoruz gelin şimdide bu açıktan nasıl kuturulur onu inceleyelim ilk olarak web app. dosyamıza tekrar gidelim ve kodlarımızı düzeltelim :

 

 

Bu kodlarda yaptığımız tek değişiklik kullanıcıdan aldığımız verileri sorgumuza parametre olarak göndermek oldu böylelikle sql injection açığını bir nebzede olsa engellemiş olduk şimdi uygulamamızı çalıştırıp tekrar sql injection açığını kontrol edelim.

 

 

Gördüğünüz gibi bu sefer aynı sql injection açığını oluşturan kodları yazıp giriş buton’una basınca bizi yanlis.aspx sayfasına yönlendirdi bunun sebebi kullanıcıdan aldığımız verileri sorgumuza parametre olarak göndermemizdir.Aynı düzeltmeleri win app. dada yapalım.

 

 

Buradada aynı şekilde kullanıcıdan aldığımız kullanıcı adı ve şifre yi sorgumuza parametre olarak gönderiyoruz.Uygulamamızı birde bu şekilde kontrol edelim.

 

 

Win app. uygulamamızdada sql injection açığından kurtulduk bu şekilde verileri sorgumuza parametre olarak göndererek, asıl ileri düzey güvenlik önlemi almak istersen verileri parametre olarak sorgumuza göndermek bazı durumlar için yetmeyebilir onun için şimdi bir tane yasaklı kelime kontrolü yapan method yazalım.Bu method’u win app. için yazalım aynısını web app. içinde yapabilirsiniz.Şimdi win app. uygulamamıza YasakliKelimeKontrol adında method yazalım ve geriye true veya false döndürsün.

 

 

Bu method ‘ u şu şekildede yazabiliriz size hangisi daha anlaşılır geliyorsa onu kullanabilirsiniz

 

 

 

 

 

Method ‘ umuzun tek yaptığı işlem bizim ona gönderdiğimiz strint verinin içinde yasakliKelimeler dizisinde belirlediğimiz kelimeler string içinde geçiyormu diye kontrol etmek eğer bizim bu method ‘ a gönderdiğimiz string içinde yasaklı kelime varsa geriye false döndürüyor yasaklı kelime bulamazsa geriyre true döndürüyor.Şimdi bu method’umuzu kullanalım

 

 

Yazdığımız method’u burada kullanıyoruz ve if kontrolü içinde yazıyoruz method’umuzdan geriye true dönüyor ise kodlarımızı çalıştırıyoruz eğer geriye false dönerse asıl kodlarımız çalışmıyor kod else düşüyor ve yasaklı kelime var diye mesaj verdiriyoruz.

 

 

Evet arkadaşlar gördüğünüz gibi daha veri tabanında sorgulama işlemlerine bile kodumuz gelmeden kullanıcının sql injection yapmaya çalıştığını tespit ettik ve engelledik bu şekilde veri tabanımıza hiç bir şekilde sorgu gönderemeyeceği için sql injection saldırılarındanda kurtulmuş olduk.Bu şekilde bir kontrol yapmış olsak bile kullanıcıdan aldığınız verileri sorgunuza parametre olarak göndermemiz en iyi yöntemdir.

 

 

Not : Uygulamanın kaynak kodlarını indirdikten sonra veri tabanını aynı şekilde kendi bilgisayarınızda oluşturmadan kodları deneyemezsiniz. Method’umuzdaki yasaklı kelimeler dizimizi genişleterek güvenliğinizi artırabilirsiniz. VS ‘ da aynı  solution içindeki projelerin hangisinin otomatik olarak başlamasını ayarlamak için  projenize sağ tıkladıktan sonra Set as StartUp Project demeniz gerekmektedir.

 

 

Kaynak Kodları Buradan İndirebilirsiniz

 

 

 

 

posted in ASP.NET, C# by gokhan

Follow comments via the RSS Feed | Yorum yapın | Trackback URL

Leave Your Comment

*

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org