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: 核心逻辑