Sql injection nedir ?
SQL Injection, bir web uygulamasına bağlı girilecek input verisi aracılığıyla sunucudaki var olan SQL sorgusuna yeni SQL sorgusu eklemesine, diğer anlamıyla yani isminden de anlaşılacağı üzere enjekte etmesine denir. SQL Injection ile hedef sitenin önemli verilerine erişilebilir, hedef sitenin veritabanı değiştirilebilir ve Sql injection ile sayfa da hack’lenebilmektedir.
Sql injection , command injection ‘ a benzer şekildedir . Fakat farklı olarak bu sefer komut operatörleri yerine ( & | ; ) Sql sorguları kullanılacaktır.
Kodda gördüğümüz
SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;
Kısmı bizim girilen değerimizin okunduğu kısımdır 1 değerini girersek ‘$id’ yerine ‘1’ ibaresi gelecektir.
Bizim zafiyetimiz ise ‘ işareti ile sorgumuzun hata vermesini yani kodumuzdaki WHERE kısmını tırnakla kapatıp diğer kısmın kapanmayıp devam etmesini sağlamasıdır.

Kolon sayısı
Özgün sorgudan döndürülen kolon sayısını belirlemek için iki etkili yöntem vardır.
İlk yöntem, ORDER BY yan tümceleri bir dizi enjekte ve bir hata oluşana kadar belirtilen sütun dizini artırma içerir.
Örneğin, enjeksiyon noktasının orijinal sorgunun WHERE yan tümcesinde alıntılanan bir dize olduğunu varsayarsak, ORDER BY komutlarını gönderirsiniz:


‘ ORDER BY 3#
Yazdığımız zaman bize hata veriyor. Yani buradan anlayabiliriz ki kolon sayısı 3 değil 2 ‘imiş .

Kolon sayısını bulmamızın nedeni UNION komutunu kullanmak içindir. UNION SELECT kullanılırken kolon sayılarının aynı olması gerekir.
Versiyon
- version() : MySQL versiyonu hakkında bilgi verir.
- database() : Veritabanı’nın veriyi aldığı database ismi hakkında bilgi verir.
- user() : Veri tabanı kullanıcısı hakkında bilgi verir.
Biz sadece versiyon bilgisini göstereceğiz. Fakat version kısmı yerine database,user yazarak da bu kodlar kullanılabilir.
1′ or ‘1’ = ‘1’ union select version(),1#

‘ union all select@@version,user()#

Bilgi Alma
‘ UNION SELECT username, password FROM users#
yazdığımız zaman karşımıza çıkan ekran bu oluyor .

‘ UNION SELECT user, password FROM users#
username tablosu bulunamadı bu yüzden user tablosunu arayalım.

Sonrasında hash verimizi bulduktan sonra hangi şifreleme modeli olduğuna bakıyoruz sonrasında o modele göre şifremizi kırıp buluyoruz.

Yukardakileri barındırdığı için 1 tanesi ile kırabiliyor olacağız. Kırabilmemiz için ilk önce hashid sini bir metin belgesine kaydedip ben sql adı altında kaydettim kaydedip hashcat ile kırıyoruz. John ilede kırabiliriz fakat biraz uzun süreceği için hashcat tercih ediyoruz.


Görüldüğü üzere kullanıcı adı admin olan hesabın şifresi passwd şeklinde bulmuş oluyoruz .