WebSocket 測試入門篇
本文是信安之路 wiki 平臺第 142 篇文章,注冊解鎖全部文章
Websocket 是一種用于 H5 瀏覽器的實時通訊協議,可以做到數據的實時推送,可適用于廣泛的工作環境,例如客服系統、物聯網數據傳輸系統,
基礎介紹
我們平常接觸最多的是 http 協議的接口,http 協議是請求與響應的模式,你發個請求到服務端,服務端給個返回你。
這種模式并不能滿足我們生活中的全部場景,就拿最近小伙伴們關注的股票基金為例,比如我想關注某個基金當天的凈值估算。
我打開一個網頁后,這時候我在頁面不需要做任何操作,頁面上的數據會自動刷新,間隔 x 秒或者 x 分鐘,會自動刷新數據。
要實現這種實時更新的效果,有幾種實現方式:
- 還是用 http 請求,用 ajax 輪詢,每間隔固定的時間,詢問一次服務端,從服務端拿最新的數據
- 使用 websocket 建立長連接,服務端和客戶端可以互相通信,服務端只要有數據更新,就可以主動推給客戶端

上圖為 ajax 輪詢與 webscokets 實現的方式對比圖,從圖中可以看出 ajax 輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出 HTTP 請求,然后由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然而 HTTP 請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
HTML5 定義的 WebSocket 協議,能更好節省服務器資源和帶寬,并且能夠更實時地進行通訊。 瀏覽器通過 JavaScript 向服務器發出建立 WebSocket 連接的請求,連接建立以后,客戶端和服務器端就可以通過 TCP 連接直接交換數據。
識別方式
想要識別網站是否使用了 websockets 協議,需要先了解其工作過程,下圖是 WebSocket 工作的詳細過程:

WebSocket 服務端的連接地址與 http 協議類似,以 ws、wss 開頭,比如:
ws://ws.xazlsec.com:8888
wss://wss.xazlsec.com:9999
wss 是 ws 基礎上用 ssl 加密傳輸信息,使用 javascript 連接的代碼案例如下:
var ws = new WebSocket("wss://wss.xazlsec.com:9999/chat");
所以識別網站是否使用該協議,可以從兩個地方分辯:
1、數據包中是否有 ws、wss 開頭的鏈接地址 2、javascript 代碼中是否包含 WebSocket 這樣的函數調用,或者以 ws、wss 開頭的鏈接
對于這種協議的數據包,常見的 web 測試工具都具備抓取能力,比如 BurpSuite,ZAP 等:

常見漏洞
1、CSWSH(跨站點網站劫持,最為廣泛的漏洞)
類似于 CSRF 漏洞,在沒有驗證請求源的情況下,任意來源均可以連接 WebSocket 服務器進行數據交互,攻擊者通過構造惡意頁面,誘使用戶訪問,然后借助用戶的身份信息與服務器建立連接,從而劫持用戶身份下的 WebSocket 連接。
2、XSS(跨站腳本攻擊)
由于大多數的聊天室,對于用戶輸入過濾不嚴導致 XSS 漏洞的發生。
3、授權問題
WebSocket 中沒有可以檢查 IDOR 和 授權問題的標頭
4、DOS 攻擊
WebSockets 允許無限數量的連接服務器。攻擊者可以用 DOS 攻擊服務器。這種行為增加了服務器的負擔并耗盡了服務器上的資源致使網站速度大大降低。
黑盒測試內容
1、檢查是否可以通過其他來源連接 ws 服務器 2、是否使用了 ssl 加密傳輸敏感信息,也就是服務器連接是否 ws 還是 wss 3、身份驗證檢查,連接 ws 服務器是否需要授權 4、輸入內容是否做了過濾,比如 xss、sql 注入等 payload,檢測是否存在該漏洞
WebSocket 靶場 DVWS 初體驗
DVWS 類似于 DVWA,但是客戶端之間的通信是通過 WebSockets 進行,項目地址:
https://github.com/interference-security/DVWS

首先在 burp 上設置好監聽端口,然后在瀏覽器中設置代理為 burp 監聽的地址:

暴力破解
打開 dvws 左側菜單中的暴力破解實驗,輸入賬號密碼之后登錄:

Burp 截取到的數據包,從 WebSocket History 選項卡中可以看到:

我們如果想暴力破解這個賬號密碼需要不斷與服務器建立連接,而 Burp 的 Intruder 是針對 http 協議進行利用,所以這里需要用到一個腳本,將 http 協議轉為 WebSocket 協議,腳本地址:
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Web%20Sockets/Files/ws-harness.py
下載腳本后,將 ws 的地址(burp 的代理端口)作為參數,啟動該腳本:
python ws-harness.py -u “ws://dvws.local:8080” -m ./message.txt
注意:如果是 https 則使用 wss,message.txt 中保存的是 websockets 消息模板,訪問時以 fuzz 作為參數名,如圖:

啟動后,監聽一個新的端口 8000:

接下來訪問:
http://localhost:8000/?fuzz=

到這里已經實現了 http 協議轉 WebSocket,針對這個連接進行 fuzz,也就是針對 WebSockets 協議的認證做 fuzz,接下來就很簡單了,使用 Intruder 進行 fuzz:

由于靶場中的用戶名密碼使用了 base64 編碼,所以需要在 burp 中設置:

到這里就完成了針對 WebSocket 協議的認證做暴力破解的操作。
SQL 注入

操作過程與暴力破解類似,設置完 http 轉 WebSocket 后:

使用 sqlmap 針對該接口進行測試,需要用到 base64encode 這個 tamper:

成功利用:
