如何渗透测试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进行协商升级,关键步骤包括:
- 客户端发送包含WebSocket特定头部的升级请求
- 服务器返回101状态码(切换协议)及WebSocket特定头部
- 通信转为WebSockets模式
根据WebSockets RFC 4.1章节,可通过以下方式使连接失败:
- 移除或修改Upgrade头字段
- 移除或修改Connection头字段
- 篡改Sec-WebSocket-Accept头字段
- 添加客户端未请求的扩展头字段
设置相应的匹配替换规则后,所有WebSocket升级请求都会失败,迫使通信回退到HTTP。
将Burp Repeater作为Socket.io客户端
强制通信降级到HTTP后,可应用自定义匹配替换规则处理原本通过WebSockets传输的流量。
但直接重放HTTP请求面临两个问题:
- 每个请求包含会话ID(sid),无效请求会导致服务器终止会话
- 请求体包含计算后的消息长度字段,错误计算会导致服务器拒绝消息
解决方案: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智能小助手)
公众号二维码