WebSocket安全漏洞与防护(进阶篇)
字数 884 2025-11-27 13:39:06
WebSocket安全漏洞与防护(进阶篇)
一、漏洞描述
WebSocket协议提供全双工通信能力,但若安全措施不当会导致严重漏洞。进阶漏洞包括:跨站WebSocket劫持(CSWSH)、WebSocket消息注入、子协议协商漏洞、流量劫持与中间人攻击。攻击者可窃取敏感数据、执行未授权操作或危害整个会话。
二、漏洞原理与攻击场景
-
跨站WebSocket劫持(CSWSH)
- 成因:WebSocket连接自动携带Cookie且无同源策略限制,类似CSRF但危害更严重(可实时交互)
- 攻击流程:
- 用户登录含WebSocket功能的网站(如在线聊天)
- 恶意页面构造WebSocket连接请求,浏览器自动附加会话Cookie
- 攻击者通过该连接发送恶意指令(如转账、改密)
-
消息注入漏洞
- 成因:服务端未校验消息格式或业务逻辑,如:
// 漏洞代码:直接解析消息内容 websocket.on('message', (data) => { const cmd = JSON.parse(data); executeCommand(cmd.action); // 未校验cmd结构 });
- 成因:服务端未校验消息格式或业务逻辑,如:
-
子协议滥用漏洞
- 攻击者伪造子协议协商(如
Sec-WebSocket-Protocol: attack-vector),干扰正常通信逻辑
- 攻击者伪造子协议协商(如
三、防护方案详解
-
CSWSH防护
- 方案1:Origin验证(服务端强制校验)
# Python示例(使用Tornado) class WSHandler(tornado.websocket.WebSocketHandler): def check_origin(self, origin): allowed_origins = ["https://example.com"] return urlparse(origin).netloc in allowed_origins - 方案2:Token验证(类似CSRF Token)
// 连接时携带动态Token const ws = new WebSocket(`wss://api.com/ws?token=${getCSRFToken()}`);
- 方案1:Origin验证(服务端强制校验)
-
消息安全处理
- 结构化消息校验:
// 使用JSON Schema校验消息格式 const schema = { type: "object", properties: { action: {enum: ["join", "leave"]}, // 限制可选操作 room: {type: "string", maxLength: 50} } }; if (!validate(schema, message)) ws.close(1008, "Invalid format");
- 结构化消息校验:
-
传输层安全强化
- 强制WSS(WebSocket Secure)并配置严格TLS参数
- 启用
Sec-WebSocket-Version: 13禁用旧版本
-
业务逻辑防护
- 会话绑定:WebSocket连接与登录会话强关联
- 速率限制:防止消息洪水攻击
from websockets import WebSocketServerProtocol class RateLimitedWS(WebSocketServerProtocol): async def process_messages(self): if self.message_count > 1000: # 每分钟限流 await self.close(1008, "Rate limit exceeded")
四、进阶防护实践
-
深度防御策略
- 消息签名(HMAC)确保完整性:
// 服务端验证消息签名 function verifyMessage(message, signature) { const expected = crypto.createHmac('sha256', secret) .update(message).digest('hex'); return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature)); }
- 消息签名(HMAC)确保完整性:
-
监控与审计
- 记录异常消息模式(如频繁重连、异常指令)
- 实时阻断可疑连接(如IP信誉库联动)
五、测试验证方法
-
CSWSH测试
- 工具:Burp Suite的"WebSocket History"选项卡
- 步骤:修改Origin头重放请求,观察是否成功建立连接
-
消息注入测试
- 发送畸形数据(如超长字符串、嵌套JSON)检测解析异常
通过多维防护组合,可显著提升WebSocket通信安全性,需在协议层、业务层、监控层形成纵深防御体系。