:Websocket除了能建立一個雙向通訊通道外,還能幹嘛?
:當然是拿來Injection阿
Websocket允許客戶端或Server建立一個全雙工/雙向的通訊,並達到客戶端和Server之間的真正異步(asynchronous)通訊,讓Web應用程式可以做到real-time。
先通過HTTP進行初始的Upgrade Handshake,在這之後所有通訊都使用"frame"通過TCP通道進行。Server通常會在初始的HTTP Websocket Handshake中驗證Origin Header,並Response 101 Switching Protocols的Status Code。
GET /chat HTTP/1.1
Host: exmaple.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: xxxxxxxxxxxxbase64
Connection: keep-alive, Upgrade
Cookie: session=xxxxxxxxxxxxxxxxxxxx
Upgrade: websocket
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: xxxxxxxxxxxxxxxxhash
而最常見的Websocket漏洞包括:
由於Websockets允許無限(大量)的Connection連接到Server,讓攻擊者可以使用DOS來癱瘓Server或使網站速度極大減慢。
Websocket協議不允許Server在握手過程中對客戶端進行身分驗證,只有正常的HTTP Connection可以使用,而Upgrade之後的Handshake仍然存在於HTTP和Websocket之間,但HTTP將身分驗證的資訊直接發送給websocket,這讓攻擊者可以利用,也就是Cross-Site WebSocket Hijacking。
過度信任HTTP Header也會產生這種問題,例如X-Forward-For Header。當然其他由HTTP Header引入websocket通訊的攻擊也都存在,跟之前介紹過很多篇的HTTP相關的攻擊一樣。
也是本篇的主題,也是在Websocket中最常發生的漏洞,通常是通過竄改Websocket message中的內容來攻擊。
例如某個通訊軟體,使用Websocket進行通訊,當一個用戶A對另一個用戶B發送消息時,發送以下Websocket message:"msg": "安安"
而用戶接受到訊息時,會在聊天視窗中收到<div role="none" class="test" dir="auto">安安</div>
若是這個通訊軟體沒有對使用者input進行檢查和處理的話,可以透過插入一些Javascript的程式碼來進行XSS攻擊:{"msg": "</div><img src=1 onerror='alert("XSS")'>"}
當然,其他像是SQL Injection、RFI等等或是之前介紹過的攻擊手法,也都可以用在測試Websocket安全性上。
在Websocket API中的DocID進行SQL Injection,
Github也是此漏洞的受害者之一。參考連結