Sql injection (Blind Boolean Based)
Değerli okuyucular merhaba. Bu yazımda Bwapp portalı üzerinden Sql injection Blind Boolean Based web güvenlik açığını inceleyeceğiz. Bu dökümanda hazır olarak kullanılan toollar yerine , kendim elle tek tek deneyerek , manuel olarak nasıl test edebileceğimizi anlattım. Biraz zamanınızı alacaktır fakat işin mantığını öğrenmeniz her zaman için iyidir 🙂 Döküman için hazırladığım videoyu dökümanın en altında bulabilirsiniz.
Bu dökümanda kullandığım Bwapp Portalını nereden indireceğinizi ve nasıl kuracağınızı bu video’da anlattım , göz atabilirsiniz,
Öncelikle bizim databasenin içerisinden herhangi bir sorgu yapmamız gerekiyor. Resimde gördüğünüz üzere , bazı filmleri aratmak için bizlere bir kutucuk vermiş.
O zaman biz database’ye Batman filmi varmıymış diye bir soralım bakalım.
Batman filmini aratmak için Search tuşuna bastıktan sonra database bize şöyle bir değer dönderdi. Yani bu film databasenin içerisinde bulunmuyormuş.
O zaman şimdi birde Iron Man’ı deneyelim . Bakalım database bize nasıl bir sonuç dönderecek.
Yukardaki resimde gördüğünüz gibi Iron Man yazdığımda database bana içerisinde böyle bir film olduğunu söyledi.Yani buradan şöyle bir sonuç çıkarabiliriz. Biz film ismi yazdığımızda database bize true veya false değeri dönderiyor. O zaman bunu biraz manipüle edelim.
Iron Man’ AND 1=1# sorgusunu yazıyorum , buradaki amacım AND operatörünün hem sol tarafdaki kodun hemde sağ taraftaki kodun doğru olduğu durumlarda bana True değerini döndereceğini bildiğim için bu kodu test etmek istiyorum. Iron Man değerini az önce denediğimizde zaten database True değerini dönderdiği için ve 1 her zaman 1’e eşit olacağı için bu sorgu sonucunda database bana True değerini dönderecektir.
Şimdi biraz daha test edelim. Bu sefer Iron Man’ AND 1=2# komutunu gireceğim. Bakalım nasıl bir değer dönderecek…
Evet tahmin ettiğimiz gibi AND operatörünün sol tarafı doğru olduğu halde sağ tarafının yanlış olduğu için (yani 1 hiçbir zaman 2 ye eşit olmadığı için) database bize False değeri dönderdi.
Bu testleri yaptıktan sonra BOOLEAN BLIND SQL INJECTION’ı kanıtlamış olduk.
O zaman kutucuğa şöyle bir komut giriyorum substring(version(),1,1)=4# Bu kodun ne işe yaradığını şöyle açıklayabilirim , MySQL’in versiyonunu bu kod yardımı ile öğrenebiliriz. İlk olarak versiyonun 4 mü değilmi olduğunu deneyelim bakalım.Database bana eğer versionu 4 ise True , değilse False değerini dönderecek.
Resimde gördüğünüz gibi database bana False değerini dönderdi. Yani database’nin versiyonu 4 değilmiş. O zaman 5 i deneyelim… substring(version(),1,1)=5# yazdığımızda ise database bize True değerini dönderdi. Yani buradan şöyle bir sonuç çıkarabiliriz , Databasenin versiyonu 5’miş.
Şimdi sömürmeye devam edelim … Şimdide Database’nin kaç karakter uzunluğunda olduğunu tahmin edelim. Bunun için length(database())=1# Komutunu yazıyorum. Bu komuttaki amacım database’nin isminin kaç karakterden oluştuğunu bulmak. İlk olarak 1 karakterden oluştuğunu söyledim ve Database bana False değeri dönderdi. Yani Database’nin ismi 1 karaktar değilmiş. Aşağıdaki resimde görüyoruz.
Şimdi 2 karakterden mi oluştuğunu soralım databaseye , length(database())=2# komutu ile tekrardan sorguluyoruz ve aşağıda gördüğümüz gibi tekrardan False değerini almış olduk yani database’nin isminin uzunluğu 2 karaktarten oluşmuyormuş.
Şimdi zaman kaybetmeme adına ben sizlere doğru değeri vereceğim. length(database())=5# komutunu yazdıktan sonra database’mizin isminin 5 karakterden oluştuğunu öğrenmiş olduk.
Evet bununlada yetinmiyoruz. Biraz daha sömürmeye devam…
Iron Man’ and substring(database(),1,1)=”a” komutunu yazıyoruz. Bu komut yardımı ile database’ye şöyle bir soru sormuş olduk , databasenin ilk harfi a mı? Bakalım database bize nasıl bir değer dönderecek.
Resimde gördüğümüz gibi Database’nin ilk harfi a değilmiş. O zaman ‘b’ yi deneyelim…Iron Man’ and substring(database(),1,1)=”b” komutunu giriyoruz.
Yukarıdaki resimde gördüğümüz gibi True değerinin döndüğünü gördük. Yani burdan şu sonucu çıkarabiliriz Database’in ilk harfi ‘b’ ymış.
Şimdi sırada Database’nin 2. Karakterinin ne olduğunu bulmak var. Öncelikle 2. Karakterinin a mı değil mi onu kontrol ediyoruz.Bunun için şöyle bir kod yazıyoruz. Iron Man’ and substring(database(),2,1)=”a”
Yukarıdaki fotoğrafta gördüğümüz gibi Databasenin isminin 2. Harfi a değilmiş.
Tek tek bütün alfabeyi denersem doküman bir hayli uzacağı için doğru değerleri girmeye başlıyorum.
Iron Man’ and substring(database(),2,1)=”W” -> 2. Değer için doğru değer.
Iron Man’ and substring(database(),3,1)=”A” ->3. Değer için doğru değer.
Iron Man’ and substring(database(),4,1)=”P” ->4.Değer için doğru değer.
Iron Man’ and substring(database(),5,1)=”P” ->5.Değer için doğru değer.
Bütün bu denemelerimiz sonucunda Database’nin isminin bWAPP olduğunu öğrenmiş olduk.
Bulmaca çözer gibi çözmüş olduk.Database’nin versiyonunu , uzunluğunu ve ismini öğrenmiş olduk. Manuel elle denediğimiz için biraz uzun sürebilir fakat tekniğini öğrenmek her zaman iyidir. Bu açıklık için SQL mapı kullanarak tek tek elle denemeden çok hızlı bir şekilde bu açığı sömürebilirsiniz.
Dökümanın detaylı videosunu hazırladım. İzlemek isteyenler için aşağıya linkini en kısa zamanda bırakacağım.