在做滲透測驗的時候,經常會遇到報文加密加簽的情況,即使通過了其他技術手段破解了加解密機制, 進行報文的篡改還是很不方便,
此時,可以引入一個開源的代理工具——Mitmproxy,
Mitmproxy簡介
Mitmproxy是一個開源的HTTPS代理工具,顧名思義,Mitm是一個用于中間人(Man-in-the-middle) 攻擊的代理工具,
如下圖所示,Mitmproxy像正常的代理服務器一樣作業于客戶端和服務端之間,通過 轉發通信報文維持通信,但同時Mitmproxy也可以查詢,記錄甚至篡改其轉發的報文,從而引發服務端 或客戶端的特定行為,來達到使用者的特定目的,

相比于成熟的代理抓包工具,如Burp Suite、Fiddler和Charles等,除了開源免費這一優勢外,Mitmproxy提供了python API, 開發者可以通過自定義腳本實作高度定制的需求,本文也正是利用Mitmproxy的自定義腳本實作報文的加解密,
Mitmproxy腳本撰寫
Mitm的腳本結構通常如下所示:
from mitmproxy import http, ctx
class MyProxy1: def foo1:
pass
def foo2:
pass
class MyProxy2:
...
addons = [
MyProxy1(),
MyProxy2(),
...
]
開啟代理后并加載腳本后,Mitm將攔截的報文并根據撰寫的腳本執行特定的行為,
常用API
下面將介紹撰寫腳本時常用的API,
- flow.request.headers
獲取所有頭資訊,包含Host、User-Agent、Content-type等欄位,
# 獲取headers內容
cookie = flow.request.headers['Cookie']
# 修改headers內容
flow.request.headers['Content-Type'] = 'application/json'
- flow.request.url
完整的請求地址,包含域名及請求引數,但是不包含放在body里面的請求引數,
#截取指定url
if flow.request.url.startswith("https://xxx.com/xxx"): pass
-
flow.request.pretty_url
同flow.request.url, -
flow.request.host域名
-
flow.request.method
請求方式,POST、GET等, -
flow.request.scheme
-
flow.request.path
請求的路徑,url除域名之外的內容, -
flow.request.get_text()
修改請求中body內容,有一些http會把請求引數放在body里面,那么可通過此方法獲取,回傳字典型別,
body = flow.request.get_text()
body_json = json.loads(flow.request.get_text())
- flow.request.set_text()
修改請求中body內容,不需轉碼,
POST /login HTTP/1.1
HOST: www.xxx.com
...
{"account":"abc", "passwd":"123456"}
newBody = {'account':'abcd', 'passwd':'123456'} flow.set_text(str(newBody))
- flow.request.query
回傳MultiDictView型別的資料,url直接帶的鍵值引數,
# 請求www.xxx.com/login?account=abc&passwd=123456
account = flow.request.query['account']
- flow.request.get_content()
回傳bytes格式內容,結果如flow.request.get_text() ,
-
flow.request.raw_content
回傳bytes格式內容,結果如flow.request.get_content(), -
flow.request.urlencoded_form
回傳MultiDictView型別資料,content-type:
application/x-www-form-urlencoded時的請求引數,不包含url直接帶的鍵值引數,
POST /login HTTP/1.1 HOST: www.xxx.com
...
content-type:application/x-www-form-urlencoded
...
account=abc&passwd=123456
account = flow.request.urlencoded_form['account']
- flow.request.multipart_form
回傳MultiDictView型別資料,content-type:multipart/form-data時的請求引數,不包含url 直接帶的鍵值引數,
以上均為獲取request資訊的一些常用方法,response除上述方法外,還有如下幾個常用方法,
-
flow.response.status_code狀態碼
-
flow.response.text回傳內容,已解碼
-
flow.response.content回傳內容,二進制
運行腳本
# -s 指定腳本
# -p 指定監聽埠號
>>> mitmdump -s myScrypt.py -p 8888
配合其他工具食用味道更佳
了解如何撰寫Mitmproxy腳本后,下面將介紹實際的測驗場景中如何應用Mitmproxy腳本,
假設我們的目標系統是一個采用了AES對稱加密的Web或APP,
客戶端將密鑰硬編碼在了前端,我們通過其他技術手段已經獲取了AES密鑰和加解密機制,現在要對查詢介面https://www.example.com/queryUserInfo uid= 進行爆破和注入測驗,
最后也給想軟體測驗的朋友們分享一份測驗資料:

以上內容,對于軟體測驗的朋友來說應該是最全面最完整的備戰倉庫了,為了更好地整理每個模塊,我也參考了很多網上的優質博文和專案,力求不漏掉每一個知識點,很多朋友靠著這些內容進行復習,拿到了BATJ等大廠的offer,這個倉庫也已經幫助了很多的軟體測驗的學習者,希望也能幫助到你,關注我公眾號:程式員二黑,免費獲取!
機會只垂青有準備的人,這是一個靠本事的社會,有時候,你之所以發展得不好,不是因為沒有機遇,而是因為你沒有準備好,導致機遇與你擦肩而過,如果你想要學習,什么時候開始都不晚,而不是瞻前顧后,你只要用盡全力,剩下的交給時間!
加油吧,測驗人!路就在腳下,成功就在明天!
推薦閱讀
在職阿里6年,一個29歲女軟體測驗工程師的心聲
當過服務員、快遞員,現在年薪30W,歷盡山河叛逆少年侄訓成長
公司新來的阿里p8,看了我做的APP和介面測驗,甩給了我這份檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342109.html
標籤:其他
