WebSocket安全漏洞详解
字数 1715 2025-11-12 06:41:28
WebSocket安全漏洞详解
1. WebSocket简介
WebSocket是一种在单个TCP连接上进行全双工通信的协议,用于实现客户端与服务器间的实时数据交换(如在线聊天、实时游戏等)。与HTTP不同,WebSocket建立连接后,双方可主动推送数据,无需重复握手。
关键特点:
- 通过HTTP Upgrade请求建立连接(握手阶段)。
- 数据传输使用轻量级的帧格式(非HTTP格式)。
- 默认端口与HTTP相同(80/443),但协议独立。
2. WebSocket安全风险概述
WebSocket的安全漏洞主要源于:
- 握手阶段的安全问题(如认证缺失、CSRF攻击)。
- 数据传输阶段的漏洞(如消息注入、敏感信息泄露)。
- 协议实现缺陷(如拒绝服务、缓冲区溢出)。
3. 常见漏洞类型与攻击手法
3.1 握手阶段漏洞
(1)认证绕过
- 问题描述:WebSocket连接建立时,服务器未验证客户端身份(如未检查Cookie或Token)。
- 攻击示例:攻击者直接通过工具(如Burp Suite的WebSocket客户端)连接WebSocket端点,无需登录即可交互。
- 修复方案:
- 在握手请求(HTTP Upgrade请求)中强制验证Session或JWT。
- 避免仅依赖Origin头验证(因其可伪造)。
(2)CSRF攻击
- 问题描述:恶意网站通过JavaScript建立WebSocket连接,利用已登录用户的身份执行操作(如转账、改密)。
- 攻击原理:浏览器自动携带受害者的Cookie发起WebSocket握手请求。
- 修复方案:
- 在握手请求中添加CSRF Token(需与Session绑定)。
- 验证Origin头是否属于合法域名(但需注意子域名欺骗风险)。
3.2 数据传输漏洞
(1)消息注入
- 问题描述:服务器未对WebSocket消息内容做过滤,导致类似SQL注入、命令注入的漏洞。
- 示例:
// 客户端发送消息 ws.send("delete from users where id=1"); // 服务器直接执行此消息作为SQL命令 - 修复方案:
- 对消息内容进行严格校验(如白名单、参数化查询)。
- 避免将消息直接拼接至代码或数据库中。
(2)敏感数据泄露
- 问题描述:WebSocket传输未加密(ws://),或服务器错误返回敏感信息(如数据库错误详情)。
- 修复方案:
- 强制使用wss://(基于TLS加密)。
- 服务器端统一处理异常,避免泄露堆栈信息。
3.3 协议实现漏洞
(1)拒绝服务(DoS)
- 问题描述:攻击者发送畸形的WebSocket帧(如超长消息、碎片化帧),导致服务器资源耗尽。
- 修复方案:
- 限制单条消息大小(如设置
maxMessageSize)。 - 使用成熟的WebSocket库(如Python的
websockets库自带防护)。
- 限制单条消息大小(如设置
(2)跨站WebSocket劫持(CSWSH)
- 问题描述:结合CSRF与WebSocket,诱导用户访问恶意页面,通过其身份建立WebSocket连接并窃听数据。
- 修复方案:同CSRF防御(验证Origin、添加CSRF Token)。
4. 实战检测步骤
-
识别WebSocket端点:
- 浏览器开发者工具中查看WS/WSS请求。
- 使用Burp Suite抓包,筛选WebSocket流量。
-
测试握手安全:
- 移除Cookie或Token重放握手请求,观察是否可连接。
- 修改Origin头为恶意域名,检查服务器是否放行。
-
测试消息安全:
- 发送特殊字符(如
'、\n、<script>)探测注入漏洞。 - 尝试发送超长消息或高频消息触发DoS。
- 发送特殊字符(如
-
工具辅助:
- Burp Suite的WebSocket Tab可拦截/修改消息。
- 使用
wsrepl等命令行工具模拟客户端。
5. 防御措施总结
- 认证与授权:握手阶段严格验证身份,消息处理时检查权限。
- 加密传输:生产环境强制使用wss://。
- 输入校验:对所有消息内容进行过滤/转义。
- 资源限制:配置消息大小、连接数、频率限制。
- 安全库:选用具备安全特性的WebSocket库(如自动验证Origin)。
通过以上分析,WebSocket安全需兼顾协议特性与传统Web漏洞的防护,确保实时通信不被恶意利用。