SQLMap偵測設定

sqlmap偵測目標時,常見設定包括以下:

  • 檢測行為
  • 檢測深度
  • 輸出內容
  • 檢測條件
  • 輔助選項


檢測行為

自動化

–batch 不詢問使用者要做什麼動作,直接用預設值自動跑完


速度

–threads 指定要用幾條線程做測試,越高速度越快,但一些防禦設設會把速度太快的列入黑名單

–delay 指定每次要暫時多久才會執行下一個測試


檢測深度

檢測等級

預設情況下SQLMAP只支援GET/POST參數的注入測試,但是使用–level 參數且數值>=2的時候也會檢查cookie裡面的參數,當>=3的時候將檢查User-agent和Referer。可以透過burpsuite等工具取得當前的cookie值,然後進行注入:

參數 –level

level 定義了注入的等級,等級越高使用的payload越多

  • 1:預設是1(<100 requests)
  • 2:大於等於2的時候也會測試HTTP Cookie頭的值(100-200 requests)
  • 3: 大於等於3的時候也會測試User-Agent和HTTP Referer頭的值(200-500 requests)
  • 4: (500-1000 requests)
  • 5: (>1000 requests)

在boundaries.xml內有明確定不同level使用不同攻撃payload,內容如下

<boundary>     
<level>3</level> 
<clause>1</clause>
<where>1,2</where>
<ptype>1</ptype>      
<prefix>)</prefix>
<suffix>[GENERIC_SQL_COMMENT]</suffix>
</boundary>

各參數說明

  • ptype 指 payload的類型
  • prefix payload前要拼接哪些字符
  • suffix: payload之後拼接那些字符
  • clause 指示了使用的查詢語句的類型,可以同時寫多個,用逗號隔開。

風險等級

參數 –risk 檢測強度,建議使用3以上,越高拆解的速度越慢

此參數用於指定風險等級,有 1~4 共 4 級。預設風險等級為 1,此等級在大多數情況下對測試目標無害。

等級2新增了基於時間的注入測試

等級3新增了OR測試。但如果注入點是在UPDATE語句中,使用OR測試可能會修改整個表的數據

refer
https://www.anquanke.com/post/id/188173


輸出內容

輸出等級

輸出的訊息總共分了七個等級,這七個等級在檢測試時會在介面裡回傳不同的內容。預設是等級1

參數: -v

  • 0:只顯示 Python 的 tracebacks 訊息、錯誤訊息 [ERROR] 和關鍵訊息 [CRITICAL];
  • 1:同時顯示普通資訊 [INFO] 和警告訊息 [WARNING];
  • 2:同時顯示調試資訊 [DEBUG];
  • 3:同時顯示注入所使用的攻擊荷載;
  • 4:同時顯示 HTTP 請求;
  • 5:同時顯示 HTTP 回應頭;
  • 6:同時顯示 HTTP 回應體。

估計完成時間

參數: –eta

輸出結果大致如下

[hh:mm:01] [INFO] the back-end DBMS is Oracle
[hh:mm:01] [INFO] fetching banner
[hh:mm:01] [INFO] retrieving the length of query output
[hh:mm:01] [INFO] retrieved: 64
17% [========>                                           ] 11/64

Then:

100% [===================================================] 64/64
[hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner:
'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

輸出到日志

將請求和回應以文字格式記錄到檔案中作為日誌,在調試時很有幫助

參數: -t < logfile path >

refer
http://www.91ri.org/6775.html
https://www.freebuf.com/sectool/164608.html


檢測條件

指定數據庫

參數 –dbms “<MySQL|Oracle|PostgreSQL|Microsoft SQL Server|…>”

範例

python sqlmap.py -u "http://192.168.1.1/sqlmap/pgsql/get_int.php?id=1" --dbms "PostgreSQL"


指定作業系統

參數 –os “<Linux|Windows>”

範例

sqlmap -u "http://192.168.1.1/sqlmap/pgsql/get_int.php?id=1" --os "Windows"


指定檢測類型

參數 –technique

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(基於時間延遲注入)
Q: inline_query SQL injection(內聯注入)

範例:指定使用報錯型注入和可多語句查詢注入

sqlmap --technique ES


輔助選項

HTTP User-Agent

預設情況下sqlmap的HTTP請求頭中User-Agent值是:sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

參數:–user-agent,–random-agent

可以使用–user-agent參數來修改,同時也可以使用–random-agent參數來隨機的從./txt/user-agents.txt中取得。

ps:
當–level參數設定為3或3以上的時候,會嘗試對User-Agent進行注入。

refer
http://www.91ri.org/6775.html


二階SQL注入

有些時候注入點輸入的資料看回傳結果的時候並不是目前的頁面,而是另外的一個頁面,這時候就需要你指定到哪個頁面取得回應判斷真假。

參數:–second-order

用法舉例如下

python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3

sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs

refer
https://xz.aliyun.com/t/3010


頁面對比

預設情況下在布林型注入中Sqlmap透過比較傳回頁面內容來判斷True或False。但有時頁面每次重新整理都會不同。例如,頁面當中包含一個動態的廣告或其他內容,這會導致sqlmap的誤判。此時使用者可以提供一個字串或一段正規匹配。

參數:–string、–not-string、–regexp

用法如下:

方法1,找一個在原始頁面與真條件下的頁面都存在的字串,而錯誤頁面中不存在的字串,使用–string參數添加字串,或–regexp添加正規則

方法2, 找一段只在錯誤頁面中存在的字串,然後使用 –not-string加該字串

refer
https://xz.aliyun.com/t/3010
https://www.itread01.com/content/1550368654.html

提高UNION query SQL injection準確度

選項:–union-char

預設情況下,sqlmap 測試聯合查詢注入會使用 NULL 字元。然而,透過提供更高的–level 值,sqlmap 將執行一個隨機數字的測試,因為存在少數情況,使用 NULL 的聯合查詢注入會失敗,而使用隨機整數會成功。

你可以手動提供選項 –union-char 和所需的數字(例如:–union-char 123)來測試該類型的 SQL 注入。

refer
https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Usage/Techniques.html

自訂注入 payload

選項:–prefix 和 –suffix

在某些情況下,只有當使用者提供附加到注入 payload 的特定後綴時,才能利用易受攻擊的參數。另外,當使用者已經知道查詢語法並希望透過直接提供注入 payload 前綴和後綴來偵測利用 SQL 注入時,這些選項對這種場景會很方便。

漏洞源代碼範例:$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";
若要偵測並利用此 SQL 注入,您可以讓 sqlmap 在偵測階段偵測邊界(與 SQL payload 前綴和後綴組合),或自行提供。

例如:sqlmap -u "http://127.0.0.1/get_str_brackets.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"

這將使所有 sqlmap 請求最終構成以下查詢:$query = "SELECT * FROM users WHERE id=('1') <PAYLOAD>

AND ('abc'='abc') LIMIT 0, 1";

refer
https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Usage/Injection.html


sqlmap偵測流程

在sqlmap偵測sql注入點的過程中,會有一系列前置發包,這些前置發包主要包括

  • 網站連通性檢測
  • WAF探測
  • 網頁穩定偵測
  • 參數動態性偵測
  • 啟發式註入偵測
  • 誤報偵測

refer
https://paper.seebug.org/729/. sqlmap運作流程
https://www.jishuwen.com/d/2egl/zh-tw SQLMAP在進行sql注入時的整個流程


深入了解SQLMAP API

https://cloud.tencent.com/developer/article/1451915
https://zhuanlan.zhihu.com/p/56005857
https://zhuanlan.zhihu.com/p/43242220 sqlmap 内核分析 I: 基础流程
https://zhuanlan.zhihu.com/p/44157153  sqlmap 内核分析 II: 核心原理-页面相似度算法实践
https://zhuanlan.zhihu.com/p/45291193  sqlmap 内核分析 III: 核心逻辑