黑客是如何攻击 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工具成熟,以下是常用工具:

  1. Burp Suite:支持WebSockets拦截和历史记录查看
  2. Zed Attack Proxy (ZAP)
  3. Pappy Proxy
  4. Man-in-the-Middle Proxy (mitmproxy)
  5. 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的传输机制

  1. 原理:Socket.io默认使用["polling","websocket"]传输方式,可通过修改强制使用HTTP轮询

  2. 实现步骤

    • 在Burp中设置匹配和替换规则
    • 修改this.transports=n.transports||["polling","websocket"]this.transports=["polling"]
    • 使用正则表达式匹配:this\.transports=.*?\.transports\|\|\["polling","websocket"]
    • 替换为:this.transports=["polling"]
  3. 效果:所有通信将通过HTTP而非WebSockets进行

方法2:阻止WebSockets升级

  1. 原理:WebSockets通过HTTP升级协商建立连接,破坏升级过程可强制使用HTTP

  2. 攻击点(基于RFC6455第4.1节):

    • 响应状态码不为101
    • 缺少或错误的Upgrade头部
    • 缺少或错误的Connection头部
    • 缺少或错误的Sec-WebSocket-Accept头部
    • 不支持的Sec-WebSocket-Extensions头部
  3. 实现:通过Burp匹配和替换规则修改服务器响应,使客户端废弃WebSockets连接

4.2 使用Burp Repeater作为Socket.io客户端

将通信降级为HTTP后,可使用Burp的Repeater等工具,但需解决两个问题:

  1. 会话ID(SID)问题

    • 每个请求包含会话号(sid参数)
    • 无效请求会导致服务器终止会话
    • 解决方案:使用Burp宏自动获取新会话ID
  2. 消息长度计算问题

    • 请求主体包含表示消息长度的字段(如"5:hello")
    • 错误长度会导致服务器拒绝消息
    • 目前无完美解决方案,需手动计算或开发插件

宏配置步骤

  1. 创建新宏:Project options -> Sessions -> Macros -> Add
  2. 配置获取新会话的URL(不带sid参数)
  3. 从响应中提取新sid
    • 参数名:sid
    • 使用正则表达式:"sid":"([^"]+)"

会话处理规则配置

  1. 创建新规则:Project options -> Sessions -> Session Handling Rules -> Add
  2. 添加"Check session is valid"动作
  3. 配置规则应用范围(至少包含Repeater)

5. 实际攻击案例

以OWASP Juice-Shop为例:

  1. 观察WebSockets历史记录中的流量
  2. 发现记分板挑战相关的消息既通过WebSockets也通过HTTP传输
  3. 通过修改传输机制或阻止升级强制使用HTTP
  4. 使用Repeater重放和修改消息

6. 防御建议

  1. 禁用HTTP备用机制

    • 配置Socket.io仅使用WebSockets:transports: ['websocket']
  2. 严格的升级验证

    • 确保WebSocket升级请求完全符合RFC6455
    • 验证所有必需头部字段
  3. 消息验证

    • 验证消息格式和长度字段
    • 实现消息完整性检查
  4. 会话管理

    • 使用强会话标识符
    • 实现会话超时机制
  5. 输入验证

    • 对所有WebSockets消息实施与HTTP请求相同的安全控制

7. 总结

WebSockets和Socket.io为实时Web应用提供了强大功能,但也引入了新的攻击面。通过理解其工作原理和攻击技术,安全测试人员可以有效地评估这些技术的安全性,而开发人员则可以实施适当的防御措施。关键点包括:

  • WebSockets与HTTP的本质区别
  • Socket.io的双传输机制特性
  • 强制降级到HTTP的技术
  • 使用标准工具测试WebSockets的方法
  • 针对这些攻击的防御策略
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'] 严格的升级验证 : 确保WebSocket升级请求完全符合RFC6455 验证所有必需头部字段 消息验证 : 验证消息格式和长度字段 实现消息完整性检查 会话管理 : 使用强会话标识符 实现会话超时机制 输入验证 : 对所有WebSockets消息实施与HTTP请求相同的安全控制 7. 总结 WebSockets和Socket.io为实时Web应用提供了强大功能,但也引入了新的攻击面。通过理解其工作原理和攻击技术,安全测试人员可以有效地评估这些技术的安全性,而开发人员则可以实施适当的防御措施。关键点包括: WebSockets与HTTP的本质区别 Socket.io的双传输机制特性 强制降级到HTTP的技术 使用标准工具测试WebSockets的方法 针对这些攻击的防御策略