SQLMP參數分析
1 目錄
9、User-defined function options
12、General options
2 學習前提
1、眾所周知,sqlmap是一款sql注入工具,其強大功能不再贅述,再次抱着學習的態度,在源碼的角度再次學習sqlmap。
首先需要了解sqlmap工作體系:

2 SQLMAP參數
-d:

其連接方式為:MYSQL:'mysql://root:123456@127.0.0.1:3306/database_name'
ACCESS:'access://database_filepath'

-u:
設置將要檢測sql注入的目標url

-l:
從Burp或WebScarab代理日志文件中解析目標,顧名思義,就是將一個HTTP請求以文件的方式引入sqlmap存而檢測注入。
首先獲取一個HTTP文件:

然后使用命令:sqlmap -l 路徑

-x:
從遠程站點地圖(.xml)文件中解析目標。此xml格式為:<loc> url </loc>
定義從xml文檔獲取URL的源碼位於:\lib\parse\sitemap.py 20行
例如:xml文檔內容
sqlmap使用命令:sqlmap -x localhost/test.xml

-m:
掃描文本文件中給定的多個目標
首先給定一個文本文檔:
sqlmap命令:sqlmap -m 路徑

-r:
從文件中加載HTTP請求,相當於對POST請求進行sql注入檢測。
首先獲取一個POST包:

然后使用命令:sqlmap -r 路徑

-g:
對谷歌的搜索結果進行SQL注入測試,非常強大的功能。
例如:sqlmap -g "inurl:\".php?id=1\""
-c:
從配置文件中加載選項
--method:
強制使用給定的HTTP方法(例如PUT),顧名思義,就是進行sql檢測時使用的HTTP方法。

--data:
要通過POST發送的數據字符串,檢測POST注入可以使用此種方法,與 -r 不同的是 --data 只檢測其后面的參數是否可以sql注入

--param-del:
用於分割參數值的字符,倘若有多個參數是,分隔符可以為; , 。等,並不一定必須為&

--cookie:
使用cookie。當sqlmap只有在level大於等於2的時候才會檢測cookie是否存在注入。所以,當默認情況下,設置此參數並不會檢測cookie是否存在注入漏洞。

所以可以構造命令: sqlmap -u "http://localhost/sqli-labs/Less-20/" --cookie "uname=admin" --level 2

--cookie-del: 
類似--param-del參數。用於分割cookie參數,適用於cookie多參數場景

--drop-set-cookie:
從響應中忽略掉 set-cookie 頭,這種場景一般是無cookie的情況下才可注入。(個人揣測,並未測試)
構造注入命令:sqlmap -u "URL" --drop-set-cookie
--user-agent:
設置user-agent的值,同cookie注入,需要level大於等於3才可。

--random-agent:
隨機使用HTTP用戶代理頭。
構造SQL注入命令:sqlmap -u "URL" --random-agent -v 5 (加-v參數,可以看到發出的請求與返回的請求,類似--level)
--host:
設置HTTP頭中的 host 消息內容。

-H --header :
額外的HTTP頭

--referer:
設置HTTP頭中的Referer的值。當level大於等於3時會檢測此值是否存在SQL注入漏洞。

--headers:
同--header
--auth-type:
HTTP身份驗證類型。(不知何用)
--auth-cred:
HTTP授權憑證。猜測用於某些需要登錄的場景。
--auth-file:
某些場景需要證書認證時,猜測使用此參數
--ignore-proxy:
忽略系統默認的代理設置
--ignore-redirects:
忽略重定向的嘗試
--proxy:
使用代理去連接URL
--proxy-cred:
連接代理需要認證時使用此參數
--proxy-file:
從文件中加載代理列表。此參數非常有用。用於過狗。
--tor:
使用TOR匿名網絡,注意一定要安裝TOR服務,否則會出錯。
--tor-port:
設置TOR匿名網絡的代理端口而非默認端口
--delay:
設置每個HTTP請求之間的延遲,默認無延遲
--timeout:
超時連接前等待的時間,個人認為還蠻有用,此參數可以節省一些時間,默認為30秒。
--retries:
設置連接超時后重復連接的次數,默認是3次
--randomize:
設置每次HTTP請求隨機改變給定某個參數的值。

--skip-urlencode:
跳過對payload數據的編碼。
--eval:
在進行HTTP請求之前執行一段python代碼
例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
--threads:
設置最大的並發線程數
-p :
需要測試的參數,加入有2個參數,而只需要檢測其中一個參數時,可以使用此參數指定。

--skip:
跳過給定參數的測試。與-p參數意義相反。假如有多個參數,但其中有一個參數不用測試時使用該參數。
--dbms:
選中某個數據庫,在已知數據庫的情況下,這樣做極大的減少測試時間。
假如已知數據庫mysql,則構造:sqlmap -u "URL" --dbms mysql
--dbms-cred:
設置數據庫的登錄憑證。用於某些需要登錄數據庫的場景。
--os:
指定數據庫服務器的操作系統,由於默認情況下,sqlmap會探測服務器操作系統,此參數可以減免此過程。
--invaild-bignum:
當需要指定一個報錯的數值時,可以使用此參數,將數值設置很大,存而報錯。
--prefix:
對將要進行測試額payload添加前綴

--suffix:
對payload添加指定后綴
--tamper:
使用指定腳本來修改注入的數據,通常用於繞過WAF
--level:
檢測等級。默認為1. level 1:只檢測GET. POST數據
level 2:檢測cookie數據
level 3:檢測user-agent,referer的數據
建議檢測等級為3
--risk:
風險等級, risk 1:測試大部分的語句
risk 2:會增加基於事件的測試語句
risk 3:會增加OR的語句測試
注意,如果風險等級為3 ,有可能會造成重置所有用戶密碼,update語句可能會更新整個表。所以請鄭重選擇。
--string:
在檢測注入的過程中,當返回頁面差距不大時,可能會導致誤判,所以出現此參數,當返回頁面與正常頁面區別不大時,可以手動指定某個字符串,當匹配到此字符串時,表示存在注入。
--not-string:
與--string相反
--regexp:
通過正則來判斷,當通過正則過濾是,則表示存在注入
--code:
通過狀態碼來進行判斷。
--text-only:
僅通過頁面內容來比較
--titles:
通過標題內容來比較
--technique:
sql注入使用哪種類型。默認為全部類型
類型共五種:1,布爾型注入 2,聯合查詢注入 3,報錯注入 4,多語句查詢注入(堆疊查詢注入) 5,延時盲注
這5中類型分別對應5個大寫字母:1,B 2,U 3,E 4,S 5,T

--time-sec:
用於在時間盲注的時候,設置延時時間。默認為5秒
構造命令:

--union-cols:
此參數設置聯合查詢注入時查詢的列數,默認情況下為1-10個字段數,level-5時會增加到50個字段數。此參數在字段大於10但是在默認情況下時出現的問題。
--union-char:
此參數設置聯合查詢時的字符,默認情況下為NULL,比如:union select null,null,null,null 修改為 union select 1,1,1,1。
--second-order:
此參數用於在注入時返回不同頁面的時候,判斷返回頁面的URL地址來確定是否具有注入。
-f --fingerprint:
使用一個最廣泛的DBMS版本指紋
-a --all:
檢索所有數據,此參數會列出數據庫用戶,主機名,密碼哈希值,是否為管理員,以及所有庫,所有表,所有字段和所有的數據,如果一個數據庫非常大的話不建議使用,非常消耗時間。

-b --banner:
此參數會列出注入數據庫得版本


--current-user:
檢索當前數據庫的用戶


--current-db:
檢索當前數據庫的數據庫名


--hostname:
檢索當前數據庫服務器的hostname


--is-dba:
檢索當前數據庫用戶是否為管理員


--users:
列舉出當前數據庫的用戶

root不算用戶
--password:
列舉數據庫用戶的密碼哈希值


--privileges:
列舉出數據庫用戶的權限
--roles:
枚舉數據庫用戶角色(僅適用於數據庫為Oracle)
--dbs:
枚舉數據庫數據庫名


--tables:
枚舉數據庫中的表


--columns:
枚舉數據庫表中的字段
--schema:
枚舉數據庫的系統架構
--count:
獲取表中數據的個數
--dump-all:
枚舉所有數據庫表條目
--search:
搜索字段名,表名或者數據庫名
共三中模式: 1:--search -D:搜索某個數據庫
2:--search -C:搜索某個字段名
3:--search -T:搜索某個表名


-D:
指定某個數據庫,與枚舉數據參數共同使用。


-T:
指定某個庫中的某個表名
建議同-D參數,以及枚舉數據參數共同使用。


-C:
指定某個庫中表的字段名


-X:
-U:
要枚舉的數據庫用戶
--exclude-sysdbs:
枚舉時排除系統表
例如mysql:會排除掉information_schema這個表。
--sql-query:
要執行的sql語句,產生sql注入時執行什么sql語句


--sql-shell:
產生一個交互式的shell


--sql-file:
給定一個文件,執行其中的SQL語句
--common-tables:
暴力破解表名。1、mysql數據庫版本小於5.0
2、使用的是Access數據庫
3、當前用戶權限不夠
--common-columns:
暴力破解列名
2.9:User-defined function options
--udf-inject:
使用用戶自定義函數注入
注:UDF注入需要堆棧查詢sql注入才可
--shared-lib:
本地共享路徑庫
--file-read:
讀取一個文件從后端數據庫文件系統
--file-write:
將數據寫入數據庫服務器文件中
--file-dest:
要寫入數據的數據庫服務器文件絕對路徑
--os-cmd:
執行系統命令。此參數執行需知網站根目錄,為root權限,並且有sys_exec(),sys_eval()函數。於是此參數看似強大,其實雞肋



--os-shell:
返回一個交互式的shell,同--os-cmd
注:暫時就這些,大多使用的參數都有。其余的參數后續再補。
2.12:General options
-s:
從存儲的(.sqlite)文件加載會話。
