在本节中,将解释如何操作WebSocket消息和连接,描述WebSocket可能出现的各种安全漏洞,并给出一些利用WebSocket漏洞的示例。
什么是网络套接字(WebSocket)?
WebSocket广泛用于现代Web应用程序,他们通过HTTP启动,并通过双向异步通信提供长期连接。
WebSocket用于各种目的,包括执行用户操作和传输敏感信息,几乎所有由常规HTTP引起的Web安全漏洞也可能与WebSocket通信有关。
WebSocket是通过HTTP发起的双向全双工通信协议,通常用于现代Web应用程序中,用于流式传输数据和其他异步流量。
HTTP和WebSocket有什么区别?
Web浏览器和网站之间的大多数通信都使用HTTP,客户端发送请求,服务器返回响应。
通常,响应会立即发生,并且事务完成。即使网络连接保持打开状态,这也将用于请求和响应的单独事务。
一些现代网站使用WebSocket,WebSocket连接是通过HTTP发起的,并且通常是长期存在的。消息可以随时向任一方向发送,并且本质上不是事务性的。在客户端或服务器准备好发送消息之前,连接通常会保持打开和空闲状态。
WebSocket在需要低延迟或服务器发起消息的情况下特别有用,例如财务数据的实时馈送。
WebSocket连接时如何建立的?
WebSocket连接通常使用客户端JavaScript创建,如下所示:
ws协议使用未加密的连接,wss协议通过加密的TLS连接建立WebSocket。
为了建立连接,浏览器和服务器通过HTTP执行WebSocket握手。浏览器发出WebSocket握手请求,如下所示:
如果服务器接受连接,它会返回一个WebSocket握手响应,如下所示:
此时,网络连接保持打开状态,可用于向任一方向发送WebSocket消息。
WebSocket握手消息的几个特性值得注意:
●请求和响应中Connection和Upgrade标头表明这是一个WebSocket握手。
●Sec-WebSocket-Version请求标头指定客户端希望使用的WebSocket协议版本,通常是13。
●Sec-WebSocket-Key请求头包含一个Base64编码的随机值,应该在每个握手请求中随机生成。
●Sec-WebSocket-Accept响应标头包含Sec-WebSocket-Key请求标头中提交值的哈希,并与协议规范中定义的特定字符串连接,这样做是为了防止错误配置的服务器或缓存代理导致的误导性响应。
WebSocket消息是什么样的?
一旦建立了WebSocket连接,客户端或服务器就可以在任一方向上异步发送消息。
可以使用客户端JavaScript从浏览器发送一条简单的消息,如下所示:
原则上,WebSocket消息可以包含任何内容或数据格式,在现代程序中,通常使用JSON在WebSocket消息中发送结构化数据。
WebSocket安全漏洞
原则上,几乎所有与WebSocket相关的Web安全漏洞都可能出现:
●传输到服务器的用户提供的输入可能会以不安全的方式进行处理,从而导致SQL注入或XML外部实体注入等漏洞。
●通过WebSocket达到的一些盲漏洞可能只能使用带外(OAST)技术检测到。
●如果攻击者控制的数据通过WebSocket传输给其他应用程序用户,则可能导致XSS或其他客户端漏洞。
如何保护WebSocket连接?
为最大程度地降低WebSocket引起的安全漏洞风险,请使用以下指南:
●使用wss://协议(基于TLS的WebSocket)。
●对WebSocket端点的URL进行硬编码,当然不会将用户可控制的数据合并到该URL中。
●保护WebSocket握手消息免受CSRF攻击,避免跨站WebSocket劫持漏洞。
●将通过WebSocket接收的数据在两个方向上都视为不受信任,在服务器端和客户端安全地处理数据,以防止基于输入的漏洞,例如SQL注入和跨站脚本攻击。
操作WebSocket消息以利用漏洞
大多数影响WebSocket的基于输入的漏洞都可以通过篡改WebSocket消息的内容来发现和利用。
例如,假设一个聊天应用程序使用WebSocket在浏览器和服务器之间发送聊天消息。当用户键入聊天消息时,会向服务器发送如下WebSocket消息:
消息的内容被传输(再次通过WebSocket)给拎一个聊天用户,并在用户的浏览器中呈现如下:
在这种情况下,如果没有其他输入处理或防御在起作用,攻击者可以通过提交以下WebSocket消息来执行Payload验证XSS攻击:
场景试验-操纵WebSocket消息以利用漏洞:
https://portswigger.net/web-security/websockets/lab-manipulating-messages-to-exploit-vulnerabilities
场景说明:
这个试验场景的在线商店通过WebSocket实现实时的聊天功能,提交的聊天消息可以实时查看。
试验目的:
要完成这个试验,需要使用WebSocket消息在支持代理的浏览器中触发alert()弹出窗口。
攻击过程:
①打开"Live chat",发送一句话,可以看到是个实时聊天系统
②打开Burp Suite后在"Proxy"的"WebSockets"中可以看到历史消息
③用聊天工具发送包含"<"的语句
④在Burp Suite中可以看到,尖括号在被发送前就已经被HTML编码了
⑤把Burp Suite设置为拦截模式,重新发送一条聊天语句,并把拦截下来的语句修改成如下注入语句:
<img src=1 onerror='alert(1)'>
⑥可以看到,浏览器会出现弹窗,完成试验
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):WebSocket安全漏洞-概念梳理
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论