WebSockets安全漏洞
字数 1879 2025-08-15 21:32:18
WebSockets安全漏洞详解与防护指南
1. WebSockets基础概念
WebSockets是现代Web应用程序中广泛使用的技术,它通过HTTP发起,并通过双向通信提供长期连接。
主要特点:
- 通过HTTP发起,但建立后保持长期连接
- 支持双向通信(客户端和服务器均可主动发送消息)
- 用于执行用户操作和传输敏感信息
- 几乎所有常规HTTP安全漏洞也可能出现在WebSockets通信中
2. HTTP与WebSockets的区别
| 特性 | HTTP | WebSockets |
|---|---|---|
| 通信模式 | 请求-响应 | 双向通信 |
| 连接持续时间 | 短暂(通常每个请求后关闭) | 长期保持 |
| 消息方向 | 客户端发起请求 | 双方均可主动发送 |
| 延迟 | 较高(需要建立新连接) | 低(保持连接) |
| 典型用途 | 常规网页加载 | 实时应用(如聊天、金融数据推送) |
3. WebSocket连接建立过程
客户端握手请求示例:
GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
服务器响应示例:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
握手关键点:
Connection: Upgrade和Upgrade: websocket表示WebSocket握手Sec-WebSocket-Version指定协议版本(通常为13)Sec-WebSocket-Key包含Base64编码的随机值(每次握手应随机生成)Sec-WebSocket-Accept是Sec-WebSocket-Key与特定字符串连接后的哈希值,用于防止误导响应
4. WebSocket消息格式
客户端发送消息示例(JavaScript):
ws.send("Peter Wiener");
现代应用通常使用JSON格式传输结构化数据:
{
"user": "Peter",
"content": "Hello there!",
"timestamp": 1603084800
}
5. WebSockets安全漏洞类型
5.1 通过篡改WebSocket消息利用漏洞
典型漏洞:
- SQL注入
- XML外部实体注入(XXE)
- 跨站脚本(XSS)
- 其他基于输入的漏洞
XSS攻击示例:
- 正常聊天消息:
<td>Hello Carlos</td> - 恶意修改为:
<td><script>alert(1)</script></td>
5.2 通过操纵WebSocket握手利用漏洞
设计缺陷类型:
- 错误信任HTTP头(如
X-Forwarded-For)进行安全决策 - 会话处理机制缺陷(握手消息决定会话上下文)
- 自定义HTTP头引入的攻击面
绕过IP封禁示例:
- 原始请求被拦截,IP被封禁
- 修改请求添加
X-Forwarded-For头:X-Forwarded-For: 1.1.1.1 - 重新建立连接并注入恶意代码
5.3 跨站点WebSocket劫持(CSWSH)
攻击原理:
- WebSocket握手上的CSRF漏洞
- 仅依赖HTTP cookie进行会话处理
- 缺少CSRF令牌或其他不可预测值
攻击影响:
- 执行未授权操作(伪装受害者)
- 检索受害者可访问的敏感数据
- 实现双向交互(比常规CSRF更强大)
漏洞识别:
检查握手请求是否:
- 仅依赖cookie进行会话处理
- 不包含CSRF令牌或其他不可预测值
示例易受攻击的握手:
GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
6. WebSocket安全防护措施
-
使用加密协议:
- 始终使用
wss://(基于TLS的WebSockets) - 避免使用不加密的
ws://
- 始终使用
-
安全处理URL:
- 硬编码WebSocket终结点URL
- 不在URL中包含用户可控数据
-
防御CSWSH:
- 在WebSocket握手请求中添加CSRF令牌
- 不要仅依赖cookie进行会话处理
-
输入处理:
- 将WebSocket接收的数据视为不可信
- 在服务器和客户端实施安全处理:
- 输入验证
- 输出编码
- 上下文相关过滤
-
其他措施:
- 实施适当的CORS策略
- 限制消息频率和大小
- 记录和监控异常WebSocket活动
7. 实际漏洞复现案例
案例1:通过篡改消息实现XSS
- 找到使用WebSocket的聊天功能
- 拦截WebSocket消息
- 插入恶意脚本:
<script>alert(1)</script> - 消息被其他用户接收并执行
案例2:通过修改握手绕过防御
- 尝试XSS被拦截,IP被封禁
- 重新握手并添加
X-Forwarded-For头 - 重新连接成功
- 注入有效XSS载荷
8. 测试与验证方法
-
手动测试:
- 拦截和修改WebSocket消息
- 检查输入验证和输出编码
- 尝试跨域WebSocket连接
-
自动化工具:
- 使用Burp Suite等工具拦截和分析WebSocket流量
- 自动化扫描工具检测常见漏洞
-
验证要点:
- 消息篡改可能性
- 握手安全性
- 跨域访问控制
通过全面理解和实施这些安全措施,可以显著降低WebSocket实现中的安全风险。