文章目录
什么是WebSocket?
WebSockets是通过HTTP发起的双向全双工通信协议。它们通常用于现代Web应用程序中以流式传输数据和其他异步流量。
Web浏览器和网站之间的大多数通信都使用HTTP。使用HTTP,客户端发送请求,服务器返回响应。通常,响应立即发生,并且事务完成。即使网络连接保持打开状态,这也将用于请求和响应的单独事务。
一些现代网站使用WebSockets。WebSocket连接是通过HTTP发起的,通常是长期存在的。消息可以随时沿任一方向发送,并且本质上不是事务性的。在客户端或服务器准备发送消息之前,连接通常将保持打开和空闲状态。
WebSocket在需要低延迟或服务器启动的消息的情况下特别有用,例如财务数据的实时提要。
WebSockets广泛用于现代Web应用程序中。它们通过HTTP发起,并通过双向双向通信提供长期连接。
WebSocket用于各种目的,包括执行用户操作和传输敏感信息。几乎与常规HTTP一起出现的任何Web安全漏洞也可能与WebSockets通信有关。
WebSockets漏洞发现
原则上,实际上与WebSockets有关的任何Web安全漏洞都可能出现:
-
用户提供的输入到服务器的输入可能以不安全的方式处理,从而导致漏洞,例如SQL注入或XML外部实体注入。
-
通过WebSockets达到的某些盲目漏洞可能仅使用带外(OAST)技术才能检测到。
-
如果攻击者控制的数据通过WebSockets传输到其他应用程序用户,则可能导致XSS或其他客户端漏洞。
处理WebSocket消息以利用漏洞
可以通过篡改WebSocket消息的内容来发现和利用影响WebSocket的大多数基于输入的漏洞。
例如,假设聊天应用程序使用WebSocket在浏览器和服务器之间发送聊天消息。用户键入聊天消息时,将向服务器发送如下所示的WebSocket消息:
{"message":"Hello Carlos"}
消息的内容(再次通过WebSockets)传输给另一个聊天用户,并在用户的浏览器中呈现,如下所示:
<td>Hello Carlos</td>
在这种情况下,如果没有其他输入处理或防御措施在起作用,则攻击者可以通过提交以下WebSocket消息来执行概念验证XSS攻击:
{"message":"<img src=1 onerror='alert(1)'>"}
操纵WebSocket握手连接以利用漏洞
只能通过操纵WebSocket握手来发现和利用某些WebSocket漏洞。这些漏洞往往涉及设计缺陷,例如:
- 在HTTP标头中放错位置的信任以执行安全性决策,例如X-Forwarded-For标头。
- 会话处理机制存在缺陷,因为处理WebSocket消息的会话上下文通常由握手消息的会话上下文确定。
- 应用程序使用的自定义HTTP标头引入的攻击面。
过滤基本的有效XSS负载和IP限制
- 使用XSS绕过格式,如:
<iframe src='jAvAsCripT:alert
‘1’'></iframe>
- 可以使用HTTP标头(如)绕过基于IP的限制X-Forwarded-For:1.1.1.1。
使用跨站点WebSocket利用漏洞
当攻击者从攻击者控制的网站建立跨域WebSocket连接时,会出现一些WebSockets安全漏洞。这称为跨站点WebSocket劫持攻击,它涉及利用WebSocket握手上的跨站点请求伪造(CSRF)漏洞。攻击通常会产生严重的影响,使攻击者可以代表受害者用户执行特权操作或捕获受害者用户可以访问的敏感数据。
如何保护WebSocket连接
为了最大程度地减少WebSockets引起的安全漏洞的风险,请使用以下准则:
- 使用wss://协议(基于TLS的WebSockets)。
- 对WebSockets端点的URL进行硬编码,当然不要将用户可控制的数据合并到此URL中。
- 保护WebSocket握手消息免受CSRF的攻击,以避免跨站点WebSocket劫持漏洞。
- 双向将通过WebSocket接收的数据视为不可信。在服务器和客户端上安全地处理数据,以防止基于输入的漏洞,例如SQL注入和跨站点脚本。