Sql Kodları ANA SAYFA    İLETİŞİM    HAKKIMIZDA 

SQL INJECTION Kullanımı

AŞAĞIDAKİ BİLGİLER ÖĞRENME AMAÇLI OLUP GELİŞTİRDİĞİNİZ KODLARDA AÇIK BIRAKMAYIP GÜVENLİK ÖNLEMLERİNİZİ ARTTIRMANIZ İÇİN VERİLMİŞTİR. LÜTFEN İLLEGAL İŞLEMLER İÇİN KULLANMAYINIZ. 

Daha önceki bölümlerde, SQL kullanarak veritabanından veri almayı (ve güncelleştirmeyi) gördük. SQL kodları metinsel yazımlardan oluştuğu için bazı kullanım şekilleri sayesinde kötü niyetli kişiler kullandığımız verilerileri izinsiz görüntüleyebilir, güncelleyebilir ve hatta silebilirler. İşte bu durumun önüne geçebilmek için yazacağımız programda bazı kontrol mekanizmaları uygulmamız gerekmektedir. Çünkü kötü niyetli kişiler ilgili yazım biçimlerini oluşturduğumuz programda bulunan bilgi giriş kutularına (örneğin: textbox) yazarlar. Dolayısı ile bilgi giriş kutularından gelen verileri önce kontrol etmemiz eğer istenmeyen bir karakter veya yazım biçimi varsa öncelikle bunlar temizlenmelidir.

Artık günümüz veritabanı teknolojilerinde bu yöntemler bazı yamalar ile (services pack) giderilmiştir. Bu yüzden kullandığınuz veritabanı motorunun güncel olduğunu kontrol etmenizde fayda var. Ancak işi şansa bırakmayıp kontrol yapılarımızı oluşturmamız gerekmektedir.

SQL INJECTION YÖNTEMLERİ


1=1 Yöntemi

Bu yöntemde gerekli seçim işlemi içine 1=1 kodu ilave edilir. SQL kodlarında eşitlik uygulanırken, eğer her iki tarafta eşit ise TRUE yani olumlu değeri geri döner. 1=1 her zaman TRUE değerini döndürecektir. Örneğin kullanıcı adı bölümüne aşağıdaki gibi bir yazım olduğunu düşünün:

SQL'in arka planda yazım şekli şöyle olsun:

sql_giris="SELECT * FROM Personel WHERE kullanici_adi=' "&k_ad&" ' and sifre='"&sifre&" ' "

Burada k_ad ve sifre değişkenleri form üzerinde doldurulan verileri içermektedir.

Form üzerinden gelen verilerin SQL koduna uyarlanmış hali şöyle olacaktır:
SELECT * FROM Personel WHERE kulanici_adi='admin' or 1=1 --' and sifre='12345'

İlk bakışta çok bir anlam ifade etmeyebilir. Ancak yazdığınız programda eğer metin kutularından gelen verileri kontrol etmiyorsanız, ozaman bu sorgulamanın degeri yazdığınız program üzerine TRUE değeri döndürecektir. Çünkü yazdığımız kodda diyoruz ki kullanıcı adı admin veya 1=1 ise devam et. 1=1 her zaman TRUE olacağı için yazdığımız uygulamaya TRUE değeri döner ve ilgili sayfaya giriş yapılabilir. Burada dikkat edilmesi gereken ikinci nokta ise 1=1 ifadesinden sonra yazılan iki tane tire (--) işretidir. Program bu işretleri gördükten sonra satırın kalanını işlemez. Yani 'and sifre=12345' kısmı işleme girmeyecektir. Çünkü program yazan kişiler sonradan koda bakıp ilgili satırın ne ile alakalı olduğunu anlamak için -- işretini koyup yanına açıklama yazarlar. İlgili program yazma programı da -- işretinden sonraki satırları açıklama satırı olarak kabul edip işleme almaz. Bazı programla dillerin -- işareti yerine // işareti, bazılarında ise /* işareti kullanılmaktadır.

Böyle bir durumun önüne geçebilmek için yazdığımız uygulamada bilgi girişi kutusundan (ör: textbox) gelen veriyi kontrol etmeli ve içerisinde OR kelimesi veya 1=1 ifadesi varsa bunları temizlemeli veya kullanıcıyı bilgi giriş ekranına geri döndürmemiz gerekmektedir.


' '=' 'Yöntemi

Bu yöntem de 1=1 mantığından türemiştir. Burada BOŞ EŞİTTİR BOŞ kuramı kullanılmaktadır. Yazdığımız program üzerinde metin kutularından veri çektiğimizi ve elde ettiğimiz verileri sql kodu kullanarak kullanıcı girişi yaptığımız düşünelim.

kullanici_adi=request.form("txtUserName")
parolasi=request.form("txtPass")
sql="Select * From Personel Where k_ad=' " & kullanici_adi & " ' AND parola=' " & parolasi & " ' "

Yazdığımız uygulama üzerinden veri çekerken kullanıcı adı ve parola alanına ' or ' '=' ' --  yazıldığını düşünelim.. O zaman kodumuz aşağıdaki gibi olacaktır.

sql=" Select * From Personel Where k_ad=' ' or ' '=' '--' AND parola=' ' or ' '=' ' "

İlgili yerlere formadan gelen verileri yazdığımız zaman kodumuz yukarıdaki gibi oluşacaktır. Tıpkı 1=1 kuralında olduğu gibi kullanıcı adına bakacak ancak arkasından gelen or ifadesi ile boş eşittir boş kuralına bakacak. Daha sonra çift tire (--) işretini görüp kodun geri kalanını çalıştırmayacaktır.
 

Çoklu SQL Kodu Yazma Yöntemi

Bir çok veri tabanı sistemi araya noktalı virgül koyarak tek seferde birden fazla sql kodu yazmaya imkan vermektedir. Metin girişi kutusuna aşağıdaki gibi giriş yaptığımızı varsayalım.


Bunu koda uyguladığımız düşünürsek
sql_kodu="Select * from personel id=105; Drop table personel  -- and personel_ad='Salih' "

Burada id alanına göre sorgu yapılıyor. id numarasına rastgele bir numara yazılıyor ve sonra ; işareti konuluyor. Bu işaret ile SQL kodunun bittiği belitiliyor ve devamına DROP TABLE ifadesi ile veritabanından Personel isimli tablonun silineceği belirtiliyor. Burada önemli olan Drop Table ifadesinden sonra silinecek tablo adının bilinmesidir. Eğer veritabanında Peronel isminde bir tablo yoksa hata verecektir. Yukarıda diğer örneklerde olduğu gibi çift tire (--) işareti yazılarak SQL kodunun geri kalanı devre dışı bırakılmış oluyor.

 

 

 


www.sqlkodlari.com - 2014
Telif hakları uyarısı: Sitedeki bilgiler izinsiz KOPYALANABİLİR. Çünkü bu bilgiler bilgisayar standartlarındandır ve bizim bulup ürettiğimiz şeyler değildir. Başka sitelerde de burada anlatılan açıklamalara rastlayabilirsiniz. Ancak ricamız buradan faydalı bir şeyler öğreniyorsanız, o zaman siteyi tavsiye edin ki başkaları da öğrensin.