SQLMAP作用
- 判斷可注入的參數
- 判斷可以用哪種SQL注入技術來注入
- 識別出哪種數據庫
- 根據用戶選擇,讀取哪些數據
五種注入模式
- 基于布爾的盲注,即可以根據返回頁面判斷條件真假的注入。
- 基于時間的盲注,即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。
- 基于報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。
- 聯合查詢注入,可以使用union的情況下的注入
- 堆查詢注入,可以同時執行多條語句的執行時的注入。
支持哪些數據庫注入?
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- IBM DB2
- SQLite
- Firebird
- Sybase
- SAP MaxDB
必備參數
觀察數據
-v參數,共有7個等級,默認為1
- -v 0 只顯示python錯誤以及嚴重的信息
- -v 1 同時顯示基本信息和警告信息。(默認)
- -v 2 同時顯示debug信息。
- -v 3 同時顯示注入的payload。
- -v 4 同時顯示HTTP請求。
- -v 5 同時顯示HTTP相應頭。
- -v 6 同時顯示HTTP相應頁面。
如果想看到SQLmap發送的測試payload最好的等級就是3
獲取目標方式
- 直接連接到數據庫
參數:-d
對單個數據庫實例運行SQLmap
python sqlmap.py -d "mysql://admin:admin@127.0.0.1:3306/db"
- 目標URL
參數:-u或者--url
python sqlmap.py -u "http(s)://targeturl:[port]/[...]"
- 從Burp或者WebScarab代理中獲取日志
參數:-l
從日志直接導出來交給sqlmap檢測 - 從文本中獲取多個目標掃描
參數:-m
url保存在文本中,sqlmap一個一個檢測 - 從文件中加載HTTP請求
參數:-r
可以跳過設置一些其他參數比如cookie,POST數據
當請求是HTTPS的時候需要配合這個--force-ssl參數使用,或者可以在Host頭后面加上:443 - 處理Google的搜索結果
參數:-g
sqlmap可以測試注入Google的搜索結果中的GET參數
python sqlmap.py -g "inurl:\".php?id=1\""
- 配置加載選項INI文件
參數:-c
加載sqlmap.conf文件里面的相關配置
請求方式
- HTTP數據
參數:--data
把數據以POST方式提交,sqlmap會像檢測GET參數一樣檢測POST的參數
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1"
- 參數拆分字符
參數:-param-del
當GET或POST的數據需要用其他字符分割測試參數的時候需要用到此參數
python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";"
- HTTP cookie頭
參數:--cookie, --load-cookies, --drop-set-cookie
web應用需要登錄的時候
在這些頭參數中測試SQL注入時
如果不想接受Set-Cookie可以使用--drop-set-cookie參數來拒接 - HTTP User-Agent頭
參數:--user-agent, --random-agent
可以使用--user-agent參數來修改,同時也可以使用--random-agent參數隨機從./txt/user-agents.txt中獲取
當--level參數設定為3或者3以上時,會嘗試對User-Agent進行注入 - HTTP host頭
參數:--host
可以手動設置HTTP host的值 - HTTP Referer頭:
參數:--referer
sqlmap可以在請求中偽造HTTP中的referer,當--level參數設定為3或者3以上的時候會嘗試對referer注入 - 額外的HTTP頭
參數:--headers
可以通過--headers參數來增加額外的http頭 - HTTP認證保護
參數:--auth-type, --auth-cred
登錄HTTP的認證保護支持三種方式:
- Basic
- Digest
- NTLM
python sqlmap.py -u "http://192.168.1.1/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"
- HTTP協議的證書認證
參數:--auth-type, --auth-cert
當web服務器需要端客戶證書進行身份驗證時,需要提供兩個文件:key_file, cert_file
key_file是格式為PEM文件,包含著你的私鑰,cert_file是格式為PEM的連接文件 - HTTP協議私有密鑰身份驗證
參數:--auth-private
這個選項應該在情況下,web服務器需要使用適當的客戶端私鑰進行身份驗證,提供的價值應該是PEM格式key_file包含你的私鑰 - HTTP(S)代理
參數:--proxy, --proxy-cred, --ignore-proxy
使用--proxy代理格式為:http://url:port/
當HTTP(S)代理需要認證是可以使用--proxy-cre參數:username:password
--ignore-proxy拒絕使用本地局域網的HTTP(S)代理 - Tor網絡匿名
參數:--tor, --tor-port, --tor-type和--check-tor
如果你需要保持匿名,而不是經過一個預定義的HTTP(S)代理服務器,你可以配置一個Tor客戶在一起Privoxy(或類似的)在你的機器上解釋Tor安裝指南,然后你可以使用一個開關--tor和sqlmap將嘗試自動設置Tor代理連接設置 - HTTP請求延遲
參數:--delay
設定兩個HTTP(S)請求間的延遲,設定為0.5的時候是半秒,默認是沒有延遲的 - 設定超時時間
參數:--timeout
可以設定一個HTTP(S)請求超過15多久判定為超時,默認是30秒 - 設定重試超時
參數:--retries
當HTTP(S)超時時,可以設定重新嘗試連接次數,默認是3次 - 設定隨機改變的參數值
參數:--randomize
可以設定某一個參數值在每一次請求中隨機的變化,長度和類型會與提供的初始值一樣 - 利用正則過濾目標網址
參數:--scope
python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"
- 避免過多的錯誤請求被屏蔽
參數:--safe-url, --safe-freq
有的web應用程序會在你多次訪問錯誤的請求時屏蔽掉你以后的所有請求,這樣在sqlmap進行探測或者注入的時候可能造成錯誤請求而觸發這個策略,導致以后無法進行。
- --safe-url:提供一個安全不錯誤的連接,每隔一段時間都會訪問一下
- --safe-freq:提供一個安全不錯誤的連接,每次測試請求之后都會再訪問一遍安全連接
- 使用SSL/HTTPS
參數:--force-ssl
如果用戶想要強迫使用SSL/HTTPS請求目標,可以使用此參數 - 關掉URL參數值編碼
參數:--skip-urlencode
根據參數位置,他的值默認將會被URL編碼,但是有些時候后端的web服務器不遵守RFC標準只接受不經過URL編碼的值,這時候就需要用--skip-urlencode參數 - 每次請求時候執行自定義的python代碼
參數:--eval
有些時候需要根據某個參數的變化,而修改另一個參數,才能形成正常的請求,這時可以用--eval參數在每次請求時根據所寫python代碼做完修改后請求
python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
優化
- 收集優化
參數:-o
這個參數是一個別名,隱式地設置以下選項和交換機
- --keep-alive
- --null-connection
- --threads=3
- 輸出預測
參數:--predict-output
這里是用于推理算法順序檢索的值的字符統計預測 - HTTP活動
參數:--keep-alive
指示sqlmap HTTP(S)使用持久連接 - HTTP空連接
參數:--null-connection
可以用在盲目注入技術來區分True從False響應 - 并發HTTP(S)請求
參數:-threads
可以指定并發HTTP(S)請求的最大數量
探測
- 測試參數
參數:-p, -skip
當使用--level的值很大但是有個別參數 不想測試的時候可以使用--skip參數,
--skip="user-agent.referer"
- URL注入點
參數:-u
python sqlmap.py -u "http://targeturl/param/value*/
- 指定數據庫
參數:-dbms
默認情況sqlmap會自動探測web應用后端的數據庫 - 風險等級
參數:--risk
共有三個風險等級,默認是1會測試大部分的測試語句,2會增加基于事件的測試語句,3會增加OR語句的SQL注入測試 - 頁面比較
參數:--string, --not-string, --regexp, --code
默認情況下sqlmap通過判斷返回頁面的不同來判斷真假,但有時候這會產生誤差,因為有的頁面在每次刷新的時候都會返回不同的代碼,比如頁面當中包含一個動態的廣告或者其他內容,這會導致sqlmap的誤判。此時用戶可以提供一個字符串或者一段正則匹配,在原始頁面與真條件下的頁面都存在的字符串,而錯誤頁面中不存在(使用--string參數添加字符串,--regexp添加正則),同時用戶可以提供一段字符串在原始頁面與真條件下的頁面都不存在的字符串,而錯誤頁面中存在的字符串(--not-string添加)。用戶也可以提供真與假條件返回的HTTP狀態碼不一樣來注入,例如,響應200的時候為真,響應401的時候為假,可以添加參數--code=200。
參數:--text-only, --titles
有些時候用戶知道真條件下的返回頁面與假條件下返回頁面是不同位置在哪里可以使用--text-only(HTTP響應體中不同)--titles(HTML的title標簽中不同)。
注入技術
- 測試是否是注入點
參數:--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(基于時間查詢注入)
- 設定延遲注入的時間
參數: --time-sec
當使用基于時間的盲注時,使用--time-sec參數設定延遲時間,默認是5秒 - 設定UNION查詢字段數
參數:--union-cols
默認情況下sqlmap測試UNION查詢注入會測試1-10字段數,當--level為5的時候,他會增加測試到50個字段數,設定--union-cols的值應該是一段整數,如:12-16 - 設定UNION查詢使用的字符
參數:--union-char
默認情況下sqlmap針對UNION查詢的注入會使用NULL字符,但是有些情況下會造成頁面返回失敗,而一個隨機整數是成功的,這時你可用--union-char指定UNION查詢的字符 - DNS泄露攻擊
參數:--dns-domain
如果用戶是控制一臺機器注冊為DNS域服務器(例如域attacker.com)他可以打開使用這個選項 - 二階SQL注入
參數:--second-order
有些時候注入點輸入的數據看返回結果的時候并不是當前的頁面,而是另外的一個頁面,這時候就需要你指定到哪個頁面獲取響應判斷的真假,--second-order后面跟一個判斷頁面的URL地址
指紋
數據庫管理系統指紋
參數:-f或--fingerprint
通過指紋判別數據庫類型
列數據
- 標志
參數:-b, --banner
獲取當前數據庫版本 - 用戶
參數:--current-user - 當前數據庫
參數:--current-db - 當前用戶是否為管理員
參數:--is--dba - 列數據庫管理用戶
參數:--users
當前用戶有權限讀取包含所有用戶的表的權限時,就可以列出所有管理用戶 - 列出并破解數據庫用戶的hash
參數:--passwords
當前用戶有權限讀取包含用戶密碼的表的權限時,就可以列出hash,并嘗試破解
python sqlmap.py -u "http://192.168.1.1/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1
也可以提供-U參數來指定爆破某個用戶的hash
- 列出數據庫管理員權限
參數:--privileges
當前用戶有權限讀取包含所有用戶的表的權限時,很可能列舉出每個用戶的權限,sqlmap將會告訴你哪個是數據庫的超級管理員,也可以用-U參數指定某個用戶 - 列出數據庫管理員角色
參數:--roles
當前用戶有權限讀取包含所有用戶的表的權限,很可能列舉出每個用戶的角色,也可以用-U參數指定你想看某個用戶的角色
僅適用于當前數據庫是Oracle的時候 - 列出數據庫系統的數據庫
參數:--dbs
當前用戶有權限讀取包含所有數據庫列表信息的表中的時候,即可列出所有的數據庫 - 列舉數據庫表
參數:--tables, --exclude-sysdbs, -D
如果不提供-D參數來列指定的一個數據的時候,sqlmap會列出所有的數據庫的所有表
--exclude-sysdbs參數是指包含了所有的系統數據庫
需要注意的是在Oracle中需要提供的是TABLESPACE_NAME而不是數據庫名稱 - 列舉數據庫中的字段
參數:--columns, -C, -T, -D
如果沒有使用-D參數指定數據庫時,默認會使用當前數據庫 - 列舉數據庫系統的架構
參數:--schema, --exclude-sysdbs
可以用此參數獲取數據庫的架構,包含所有的數據庫,表和字段,以及各自的類型
加上--exclude-sysdbs參數,將不會獲取數據庫自帶的系統庫內容 - 獲取表中數據個數
參數:--count - 獲取整個表的數據
參數:--dump, -C, -T, -D, --start, --stop, --first, --last
如果當前管理員有權限讀取數據庫其中一個表的話,就能獲取整個表的所有內容
使用-D, -T參數指定數據庫和表,不使用-D參數時,默認使用當前庫
可以獲取指定庫中的所有表的內容,只用-dump和-D參數(不使用-T與-C參數) - 獲取所有數據庫表的內容
參數:--dump-all, --exclude-sysdbs
使用--dump-all參數獲取所有數據庫表的內容,可同時加上--exclude-sysdbs只獲取用戶數據庫的表,需要注意在Microsoft SQL Server中maser數據庫沒有考慮成為一個系統數據庫,因為有的管理員會把他當成用戶數據庫一樣使用 - 搜索字段,表,數據庫
參數:--search, -C, -T, -D
--search可以用來尋找特定的數據庫名,所有數據庫中的特定表名,所有數據庫中的特定字段
-C后跟著用逗號分隔的列名,將會在所有數據庫表中搜索指定的列名
-T后跟著用逗號分隔的表名,將會在所有數據庫中搜索指定的表名
-D后跟著用逗號分隔的庫名,將會在所有數據庫中搜索指定的庫名 - 運行自定義的SQL語句
參數:--sql-query, --sql-shell
如果是SELECT查詢語句,sqlmap將會輸出結果,如果通過SQL注入執行其他語句,需要測試是否支持多語句執行
爆破
- 暴力破解表名
參數:--common-tables
當使用--tables無法獲取到數據庫的表時,可以使用此參數 - 暴力破解列名
參數:--common-columns
與暴力破解表名一樣,暴力跑的列名在txt/common-columns.txt中
用戶自定義函數注入
用戶自定義函數(UDF)
參數:--udf-inject, --shared-lib
你可以通過反編譯MySQL注入你自定義的函數(UDFs)或PostgreSQL在Windows中共享庫,DLL,或者Linux/Unix中共享對象,sqlmap將會問你一些問題,上傳到服務器數據庫自定義函數,然后根據你的選擇執行他們,當你注入完成后,sqlmap將會移除它們。
系統文件操作
- 從數據庫服務器中讀取文件
參數:--file-read
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數,讀取的文件可以是文本也可以是二進制文件 - 把文件上傳到數據庫服務器中
參數:--file-write, --file-dest
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數,上傳的文件可以是文本也可以是二進制文件
操作系統
- 運行任意操作系統命令
參數:--os-cmd
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數
在MySQL,PostgreSQL,sqlmap上傳一個二進制庫,包含用戶自定義的函數,sys_exec()和sys_eval() - 寫入真實的shell
參數:--os-shell
網站絕對路徑
- ASP
- ASP.NET
- JSP
- PHP
- Meterperter配合使用
參數:--os-pwn, --os-smbrelay, --os-bof, --priv-esc, --msf-path, --tmp-path
- 通過用戶自定義的sys_bineval()函數在內存中執行Metasploit的shellcode,支持MySQL和PostgreSQL數據庫,參數:--os-pwn
- 通過用戶自定義的函數上傳一個獨立的payload執行 ,MySQL和PostgreSQL的sys_exec()函數,Microsoft SQL Server的xp_cmdshell()函數,參數:--os-pwn
- 通過SMB攻擊(MS08-068)來執行Metasploit的shellcode,當sqlmap獲取到的權限足夠高時(Linux/Unix的uid=0,Windows是Administrator),參數:--os--smbrelay
- 通過溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存儲過程(MS09-004),在內存中執行Metersploit的payload,參數:--os-bof
對Windows注冊表的操作
讀取注冊表值
參數:--reg-read
寫入注冊表值
參數:--reg-add
刪除注冊表值
參數: --reg-del
注冊表輔助選項
參數: --reg-key, --reg-value, --reg-data, --reg-type
其他的一些參數
- 使用參數縮寫
參數:-z
有使用參數太長太復雜,可以使用縮寫模式 - 成功SQL注入時警告
參數:-alert - 設定回答
參數:--answers
當sqlmap提出輸入時,自動輸入自己想要的回答 - 發現SQL注入時發出蜂鳴聲
參數:--beep - 啟發式檢測WAF/IPS/IDS保護
參數:--check-waf
WAF/IPS/IDS保護可能會對sqlmap造成很大的困擾,如果懷疑目標有防護的話,可以使用此參數來測試,sqlmap將會使用一個不存在的參數來注入測試 - 清理sqlmap注入產生的UDF(s)和表
參數:--cleanup - 禁用彩色輸出
參數:--disable-coloring - 使用指定的Google結果頁面
參數:--gpage
默認sqlmap使用前100個URL地址作為注入測試,結合此選項,可以指定頁面的URL測試 - 使用HTTP參數污染
參數:-hpp
HTTP參數污染可能會繞過WAF/IPS/IDS保護機制,這個對ASP/IIS與ASP.NET/IIS平臺很有效 - 測試WAF/IPS/IDS保護
參數:--identify-waf
sqlmap可以嘗試找出WAF/IPS/IDS保護,方便用戶做出繞過方式 - 模仿智能手機
參數:--mobile - 安全的刪除output目錄的文件
參數:--purge-output
刪除文件而不被恢復 - 啟發式判斷注入
參數:--smart
有時對目標非常多的URL進行測試,為節省時間,只對能夠快速判斷為注入的報錯點進行注入 - 選擇測試的有效荷載/標題
參數:--text-filter
如果你想過濾測試的有效荷載/標題可以使用這個參數 - 初級用戶向導參數
參數:--wizard
面向初級用戶的參數,可以一步一步教你如何輸入針對目標注入
SQLmap腦圖