黑客是如何攻击 WebSockets 和 Socket.io的
字数 2170 2025-08-29 08:32:25
WebSockets与Socket.io安全攻防指南
1. WebSockets概述
WebSockets是一种允许浏览器和服务器建立单个TCP连接并进行双向异步通信的技术。与HTTP的无状态特性不同,WebSockets是有状态协议,具有以下特点:
- 建立单个TCP连接后保持打开状态
- 支持双向异步通信
- 客户端和服务器可随时发送消息,无需等待另一端响应
- 相比HTTP轮询更高效,适合实时应用
2. WebSockets测试工具
测试WebSockets的工具不如HTTP工具成熟,以下是常用工具:
- Burp Suite:支持WebSockets拦截和历史记录查看
- Zed Attack Proxy (ZAP)
- Pappy Proxy
- Man-in-the-Middle Proxy (mitmproxy)
- WebSocket/Socket.io (WSSiP)
3. Socket.io简介
Socket.io是一个流行的JavaScript WebSockets库,特点包括:
- GitHub上获得41,000+星
- NPM WebSockets包排行榜第二、三名
- 被OWASP Juice-Shop等项目采用
- 默认支持两种传输方式:WebSockets和HTTP轮询(polling)
4. WebSockets攻击技术
4.1 将WebSockets降级为HTTP
方法1:修改Socket.io的传输机制
-
原理:Socket.io默认使用
["polling","websocket"]传输方式,可通过修改强制使用HTTP轮询 -
实现步骤:
- 在Burp中设置匹配和替换规则
- 修改
this.transports=n.transports||["polling","websocket"]为this.transports=["polling"] - 使用正则表达式匹配:
this\.transports=.*?\.transports\|\|\["polling","websocket"] - 替换为:
this.transports=["polling"]
-
效果:所有通信将通过HTTP而非WebSockets进行
方法2:阻止WebSockets升级
-
原理:WebSockets通过HTTP升级协商建立连接,破坏升级过程可强制使用HTTP
-
攻击点(基于RFC6455第4.1节):
- 响应状态码不为101
- 缺少或错误的Upgrade头部
- 缺少或错误的Connection头部
- 缺少或错误的Sec-WebSocket-Accept头部
- 不支持的Sec-WebSocket-Extensions头部
-
实现:通过Burp匹配和替换规则修改服务器响应,使客户端废弃WebSockets连接
4.2 使用Burp Repeater作为Socket.io客户端
将通信降级为HTTP后,可使用Burp的Repeater等工具,但需解决两个问题:
-
会话ID(SID)问题:
- 每个请求包含会话号(
sid参数) - 无效请求会导致服务器终止会话
- 解决方案:使用Burp宏自动获取新会话ID
- 每个请求包含会话号(
-
消息长度计算问题:
- 请求主体包含表示消息长度的字段(如"5:hello")
- 错误长度会导致服务器拒绝消息
- 目前无完美解决方案,需手动计算或开发插件
宏配置步骤
- 创建新宏:
Project options -> Sessions -> Macros -> Add - 配置获取新会话的URL(不带
sid参数) - 从响应中提取新
sid:- 参数名:
sid - 使用正则表达式:
"sid":"([^"]+)"
- 参数名:
会话处理规则配置
- 创建新规则:
Project options -> Sessions -> Session Handling Rules -> Add - 添加"Check session is valid"动作
- 配置规则应用范围(至少包含Repeater)
5. 实际攻击案例
以OWASP Juice-Shop为例:
- 观察WebSockets历史记录中的流量
- 发现记分板挑战相关的消息既通过WebSockets也通过HTTP传输
- 通过修改传输机制或阻止升级强制使用HTTP
- 使用Repeater重放和修改消息
6. 防御建议
-
禁用HTTP备用机制:
- 配置Socket.io仅使用WebSockets:
transports: ['websocket']
- 配置Socket.io仅使用WebSockets:
-
严格的升级验证:
- 确保WebSocket升级请求完全符合RFC6455
- 验证所有必需头部字段
-
消息验证:
- 验证消息格式和长度字段
- 实现消息完整性检查
-
会话管理:
- 使用强会话标识符
- 实现会话超时机制
-
输入验证:
- 对所有WebSockets消息实施与HTTP请求相同的安全控制
7. 总结
WebSockets和Socket.io为实时Web应用提供了强大功能,但也引入了新的攻击面。通过理解其工作原理和攻击技术,安全测试人员可以有效地评估这些技术的安全性,而开发人员则可以实施适当的防御措施。关键点包括:
- WebSockets与HTTP的本质区别
- Socket.io的双传输机制特性
- 强制降级到HTTP的技术
- 使用标准工具测试WebSockets的方法
- 针对这些攻击的防御策略