【技術分享】越權檢測系統從零開發之-Chrome插件開發
因為公司業務上越權問題太多了,平時會耗費了我們安全部門大量的人力物力,所以導致平時我們做的大部分工作都是重復的沒有意義的。基于以上問題我打算自己開發一個用于越權檢測的系統用自動化替代大部分重復的工作。在決定自己開發之前我也嘗試過教公司測試的同學使用burpsuite,但是成本太高了,幾乎需要手把手一個一個教。所以本次開發的系統一定是要簡單,易用,易拓展并且高效!
技術棧
SpringbootMybatisMySQLChrome插件開發
整體思路
我的整體思路是:通過Chrome插件將測試同學的流量鏡像到越權檢測服務器,然后服務器重新向目標站點發送三個請求,請求1為原始請求,請求2為攜帶不同權限的cookie請求,請求3為不攜帶任何身份字段的請求!然后越權檢測系統會對比這三個請求的狀態碼,響應內容相似度,以及響應長度判斷是否存在越權并且將結果直接展現給普通用戶,具體思路如下圖所示

Crome插件技術實現部分
1.開始
我最初的想法模仿burpsuite以下發證書的形式對Chrome的流量進行代理,但是無奈找不到合適的辦法,而且感覺實現有點復雜,經過多方資料查找,在Chrome開發文檔中發現,Google提供了底層抓取Chrome流量的接口,這些底層接口可以無視https加密,等于直接在加密之前抓取到HTTP請求的明文!這樣就非常方便了,我們也不用再考慮加解密的問題,這樣是極方便的,所以平時開發之前還是要多看文檔, 不然悶頭搞最后發現官方已經提供接口就很悲催了!
2.面向官方文檔編程
首先我們需要明確當我們在請求一個目標站點時我們需要抓去哪些關鍵信息并將其傳給后臺,我們要獲取的其實就三部分1.請求的URL 2.用于身份校驗的請求頭比如Cookie,SSO_TOKEN,等等字段 3請求參數。明確這一點之后我們就開始從文檔中找找看看官方是否提供了相應的接口。
Chrome開發文檔中關于抓取流量的關鍵點介紹,我們看一下文檔中是如何描述這個功能的:
Use the chrome.webRequest API to observe and analyze traffic and to intercept, block, or modify requests in-flight
大概意思就是利用chrome.webRequest這個接口可以獲取,截斷分析數據包。官方文檔,
看文檔看的很頭疼對不對?拿我們就直接進入重點! onBeforeRequest,onBeforeSendHeaders,onSendHeaders,onAuthRequired,onBeforeRedirect,onResponseStarted,onCompleted,onErrorOccurred等8個函數在一個請求的全生命周期分別起不同作用,這8個函數的起作用的生命周期如下圖所示:

文檔是非常枯燥,我們都喜歡事例,那接下來我用一個demon來闡釋這些函數的作用吧!
3.Chrome插件的基本結構
這些接口是Google給Chrome開發的插件接口,如果想讓這些代碼跑起來查看效果,首先要跑起來一個簡單的Chrome插件,為了方便大家我將文章中用到的代碼直接上傳到了Github讀者可直接下載練習。
一個正常的Chrome插件文件結構如下所示:

background.js作用跟其名稱一樣,只要Chrome插件在運行,background.js就會起作用,也就是說我們使用Chrome插件時遇到的所有數據包以及其他數據都是可以用該文件處理。回到文章最開頭,我們的最初想要的是通過通過Chrome插件的接口直接將流量鏡像到我們的后臺服務器,所以目前需要做的就是在background.js中使用接口查看效果。
4.實戰
下面就拿onBeforeRequest來做個例子,因為剩下的使用方式大同小異,
chrome.webRequest.onBeforeRequest.addListener(details => { console.log(dateTime+ "打印一下onBeforeRequest的detail:"); console.log(details);}, {urls: [""]}, ["requestBody"]);
看著是不是很簡單,但是要注意兩點1.detail是該函數抓到的信息,2.{urls: [""]}, ["requestBody"])為配置信息,簡單講,這些配置信息決定了onBeforeRequest會抓取哪些信息,配置參數如何尋找以及如何配置如下圖所示,官方文檔地址

上面實例中的代碼中的作用是攔截所有URL請求,并且獲取HTTP請求體,那我們如何查看攔截效果呢?話不多說直接上圖,在這里可能看到background.js打印的所有信息:


我們直接看一下detail里面到底是什么,如下圖所示紅框框里面即為所detail的所有信息

根據文檔中的介紹,我們發現onBeforeRequest只能獲取我們需要的請求參數,我們還要獲取請求中的請求頭,查看官方文檔,我們發現onBeforeSendHeaders可以獲取到我們需要的請求頭,話不多說直接上代碼如下所示
chrome.webRequest.onSendHeaders.addListener(details => {console.log("打印一下onSendHeaders的detail:");console.log(details);}, {urls: [""]}, ["requestHeaders","extraHeaders"]);
我們直接看一下效果,發現可以獲取到我們需要的請求頭如下圖所示

至此我們已經獲取了我們所需要的請求參數和請求頭,請求的URL,我們將這些參數組合起來發送給越權檢測服務器。
后記
文中用到的代碼我直接上傳到了Github,需要學習實踐的同學可以直接下載使用!