当前位置: 首页 > news >正文

WebSockets与Socket.io渗透测试实战指南

如何渗透测试WebSockets与Socket.io

Ethan Robish //

WebSockets技术概述

WebSockets是一种允许浏览器与服务器建立单一TCP连接并实现双向异步通信的技术。这对Web应用极具价值,可实现实时更新而无需浏览器在后台发送大量HTTP轮询请求。但对渗透测试者而言,由于工具对WebSockets的支持远不如HTTP普遍和成熟,这增加了测试难度。

除Burp Suite外,现有部分工具可处理WebSockets:

  • Zed Attack Proxy (ZAP)
  • Pappy Proxy
  • Man-in-the-Middle Proxy (mitmproxy)
  • WebSocket/Socket.io (WSSiP)

本文重点聚焦socket.io——一个流行的JavaScript WebSockets库,但部分技术思路也可应用于其他库或通用WebSockets协议。

Socket.io的流行度与测试环境

Socket.io在Github拥有超过4.1万星标,同时占据NPM上第二和第三大最受欢迎WebSockets包的位置。本文以使用socket.io的OWASP Juice-Shop项目作为演示环境。

Burp Suite中的WebSockets流量分析

在浏览器中访问Juice-Shop后,可在Burp的Proxy→WebSockets history中查看WebSocket流量。与无状态的HTTP协议始终存在请求/响应对不同,WebSockets是有状态协议,客户端和服务器可随时发送消息而不需等待对方响应。

WebSockets历史视图主要显示单字节消息收发,但当应用执行关键操作时会出现较大负载的消息。

Burp具备实时拦截和修改WebSockets消息的能力,但缺乏Repeater、Scanner或Intruder等高级功能。WebSocket拦截默认启用,只需开启主拦截开关即可。

将WebSockets降级为HTTP

方法一:利用Socket.io的HTTP回退机制

通过观察发现,部分WebSockets消息会同时出现在HTTP历史记录中。socket.io文档表明“polling”和“websockets”是两种默认传输选项,且可通过配置禁用轮询。

通过分析socket.io.js源码发现关键代码:

this.transports=n.transports||["polling","WebSocket"]

通过在Burp的Proxy→Options中设置匹配替换规则,将默认传输方式修改为仅轮询:

原始值:this\.transports=.*?\.transports\|\|\["polling","websocket"]
替换值:this.transports=["polling"]

(需启用正则匹配模式)

方法二:中断WebSockets升级过程

此方法针对WebSockets协议本身,更具通用性。WebSockets首先通过HTTP进行协商升级,关键步骤包括:

  1. 客户端发送包含WebSocket特定头部的升级请求
  2. 服务器返回101状态码(切换协议)及WebSocket特定头部
  3. 通信转为WebSockets模式

根据WebSockets RFC 4.1章节,可通过以下方式使连接失败:

  • 移除或修改Upgrade头字段
  • 移除或修改Connection头字段
  • 篡改Sec-WebSocket-Accept头字段
  • 添加客户端未请求的扩展头字段

设置相应的匹配替换规则后,所有WebSocket升级请求都会失败,迫使通信回退到HTTP。

将Burp Repeater作为Socket.io客户端

强制通信降级到HTTP后,可应用自定义匹配替换规则处理原本通过WebSockets传输的流量。

但直接重放HTTP请求面临两个问题:

  1. 每个请求包含会话ID(sid),无效请求会导致服务器终止会话
  2. 请求体包含计算后的消息长度字段,错误计算会导致服务器拒绝消息

解决方案:Burp宏与会话处理规则

创建宏:在Project options→Sessions→Macros中添加新宏,通过无sid参数的URL建立新会话:

/socket.io/?EIO=3&transport=polling&t=MJJJ4Ku

使用正则表达式"sid"\:"(.*?)"提取新会话ID。

创建会话处理规则:在Project options→Sessions→Session Handling Rules中新建规则,配置“检查会话有效性”操作并设置作用范围(建议至少包含Repeater)。

最终思考

尽管通过上述方法解决了会话管理问题,但由于消息长度计算复杂性,仍无法完全使用Burp Scanner和Intruder功能。现有Burp插件修改方案尚未完全解决服务器兼容性问题,此领域仍需进一步研究。


本文基于Black Hills Information Security的技术文章进行编译,旨在提供WebSockets安全测试的实用方法。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

http://www.hskmm.com/?act=detail&tid=11511

相关文章:

  • 完整教程:VLAN划分——TRUNK
  • 现代操作系统-音频处理技术1 Linux驱动底层
  • 元推理:人和事物,都是针对性的存在着与必然因果,残缺之美
  • 人和事物,都是针对性的存在着与必然因果,残缺之美
  • ArcEngine10.2中融合工具Dissolve的bug
  • Linux驱动适配I2C/SPI例子
  • [重要] PySimpleGU控件函数用法整理
  • 使用XState测试分布式微服务的完整指南
  • 含“华”量超高的奥迪,卖爆了
  • 某些外审专家的意见,真是臭不可闻
  • 智元首次明确七人合伙人团队
  • 大模型赋能的具身智能:自主决策和具身学习技术最新综述
  • ST首批中国产MCU,价格曝光
  • 狄拉克δ函数探源:从广义函数到分析核与信号窗 (AI辅助撰写)
  • 解决 Windows 无法挂载 HTTP WebDAV(AList,OpenList)的问题
  • 在Ubuntu系统中使用gcc和Makefile编译C程序
  • HN CSP-S 2024 游记
  • CSP-S 2025 初赛解析
  • 科研牛马碎碎念
  • 9.20 闲话
  • 芯片组
  • 18.日志
  • testuserjiagou
  • IDEA 自动编译和热部署
  • testusers3
  • RabbitMQ核心模型简介,Hello World的生产与消费
  • 关于oj在创建文件夹失败的原因
  • Linux 基础命令 02
  • RabbitMQ核心模型简介,Hello World的发送与消费
  • 软工个人项目 - Helen