侧边栏壁纸
博主头像
咿呀咿呀

你的脚步太乱,所以行程有限

  • 累计撰写 29 篇文章
  • 累计创建 4 个标签
  • 累计收到 2 条评论
标签搜索

WebSocket安全

咿呀咿呀
2022-04-16 / 0 评论 / 0 点赞 / 329 阅读 / 5,449 字
温馨提示:
本文最后更新于 2022-04-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

所有内容,来自burpsuite官方靶场(portswigger)

测试WebSockets安全漏洞

image-20211021075156880

网络套字节

​ WebSockets 广泛用于现代 Web 应用程序。它们通过 HTTP 启动,并通过双向异步通信提供长期连接。WebSockets 用于各种目的,包括执行用户操作和传输敏感信息。实际上,任何由常规 HTTP 引起的 Web 安全漏洞也可能与 WebSockets 通信相关。

什么是WebSockets?

​ WebSockets是一种通过 HTTP 发起的双向、全双工通信协议。它们通常用于现代 Web 应用程序,用于流式传输数据和其他异步流量。

HTTP 和 WebSockets 有什么区别?

​ Web 浏览器和网站之间的大多数通信都使用 HTTP。使用 HTTP,客户端发送请求,服务器返回响应。通常,响应立即发生,事务完成。即使网络连接保持打开状态,这也将用于请求和响应的单独事务。

​ 一些现代网站使用 WebSockets。WebSocket 连接是通过 HTTP 发起的,并且通常是长期存在的。消息可以随时向任一方向发送,并且本质上不是事务性的。连接通常会保持打开和空闲状态,直到客户端或服务器准备好发送消息。

​ WebSockets 在需要低延迟或服务器发起的消息的情况下特别有用,例如金融数据的实时馈送。

WebSocket 连接是如何建立的?

​ WebSocket 连接通常使用客户端 JavaScript 创建,如下所示:

var ws = new WebSocket("wss://normal-website.com/chat");
Tips
该`wss`协议通过加密的 TLS 连接建立 WebSocket,而该`ws`协议使用未加密的连接。

为了建立连接,浏览器和服务器通过 HTTP 执行 WebSocket 握手。浏览器发出一个 WebSocket 握手请求,如下所示:

GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2Upgrade: websocket

如果服务器接受连接,它会返回一个 WebSocket 握手响应,如下所示:

HTTP/1.1 101 Switching Protocols
Connection: UpgradeUpgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=

此时,网络连接保持打开状态,可用于向任一方向发送 WebSocket 消息。

Notes

WebSocket 握手消息的几个特性值得注意:

  • 请求和响应中 的ConnectionUpgrade标头表明这是一次 WebSocket 握手。
  • Sec-WebSocket-Version请求头指定WebSocket协议版本的客户端希望使用。这通常是13.
  • Sec-WebSocket-Key请求报头包含Base64编码的随机值,这应该在每个握手请求是随机产生的。
  • Sec-WebSocket-Accept响应报头包含在提交的值的散列Sec-WebSocket-Key请求头,具有在协议规范中定义的特定的字符串串联。这样做是为了防止由错误配置的服务器或缓存代理导致的误导性响应。

WebSocket 消息是什么样的?

一旦建立了 WebSocket 连接,客户端或服务器就可以在任一方向上异步发送消息。

可以使用客户端 JavaScript 从浏览器发送一条简单的消息,如下所示:

ws.send("Peter Wiener");

原则上,WebSocket 消息可以包含任何内容或数据格式。在现代应用程序中,通常使用 JSON 在 WebSocket 消息中发送结构化数据。

例如,使用 WebSockets 的聊天机器人应用程序可能会发送如下消息:

{"user":"Hal Pline","content":"I wanted to be a Playstation growing up, not a device to answer your inane questions"}

操纵WebSocket流量

  • 拦截和修改WebSocket消息

  • 重放并生成新的WebSocket消息

  • 操作WebSocket连接

拦截和修改WebSocket消息

可以使用 Burp Proxy 拦截和修改 WebSocket 消息,如下:

  • 将浏览器配置为使用 Burp Suite 作为其代理服务器。
  • 浏览到使用 WebSockets 的应用程序函数。您可以通过使用应用程序并查找出现在 Burp Proxy 内的 WebSockets 历史选项卡中的条目来确定 WebSockets 正在被使用。
  • 在 Burp Proxy 的 Intercept 选项卡中,确保开启了拦截。
  • 当浏览器或服务器发送 WebSocket 消息时,它会显示在拦截选项卡中,供您查看或修改。按转发按钮转发消息。
Tips:
可以配置在 Burp Proxy 中是拦截客户端到服务器或服务器到客户端的消息。在“选项”选项卡的“拦截 WebSocket 消息”选项中执行此操作。
重放和生成新的WebSocket消息

​ 除了即时拦截和修改 WebSocket 消息外,还可以重放单个消息并生成新消息。可以使用 Burp Repeater 来做到这一点:

  • 在 Burp Proxy 中,在 WebSockets 历史记录或拦截选项卡中选择一条消息,然后从上下文菜单中选择“发送到中继器”。
  • 在 Burp Repeater 中,可以编辑选定的消息,并一遍又一遍地发送它。
  • 可以输入新消息并以任一方向将其发送到客户端或服务器。
  • 在 Burp Repeater 的“History”面板中,可以查看通过 WebSocket 连接传输的消息的历史记录。包括在 Burp Repeater 中生成的消息,以及浏览器或服务器通过相同连接生成的任何消息。
  • 如果要在历史记录面板中编辑和重新发送任何消息,可以通过选择消息并从上下文菜单中选择“编辑并重新发送”来执行此操作。
操作WebSocket连接

​ 除了操作 WebSocket 消息外,有时还需要操作建立连接的WebSocket 握手。

在多种情况下,可能需要操作 WebSocket 握手:

  • 它可以达到更多的攻击面。
  • 某些攻击可能会导致连接断开,因此需要建立一个新的连接。
  • 原始握手请求中的令牌或其他数据可能已过时并需要更新。

可以使用 Burp Repeater 操作 WebSocket 握手:

  • 如前所述向 Burp Repeater 发送 WebSocket 消息。
  • 在 Burp Repeater 中,单击 WebSocket URL 旁边的铅笔图标。这将打开一个向导,可以附加到现有的已连接 WebSocket、克隆已连接的 WebSocket 或重新连接到已断开连接的 WebSocket。
  • 如果选择克隆连接的 WebSocket 或重新连接到断开连接的 WebSocket,则向导将显示 WebSocket 握手请求的完整详细信息,可以在执行握手之前根据需要对其进行编辑。
  • 当单击“连接”时,Burp 将尝试执行配置的握手并显示结果。如果成功建立了新的 WebSocket 连接,则可以使用它在 Burp Repeater 中发送新消息。
WebSocket消息以利用漏洞

​ 大多数影响 WebSocket 的基于输入的漏洞都可以通过篡改 WebSocket 消息的内容来发现和利用。

例如,假设聊天应用程序使用 WebSockets 在浏览器和服务器之间发送聊天消息。当用户键入聊天消息时,会向服务器发送如下所示的 WebSocket 消息:

{"message":"Hello Carlos"}

消息的内容(再次通过 WebSockets)传输到另一个聊天用户,并在用户的浏览器中呈现如下:

<td>Hello Carlos</td>

在这种情况下,如果没有其他输入处理或防御在起作用,攻击者可以通过提交以下 WebSocket 消息来执行概念验证 XSS 攻击:

{"message":"<img src=1 onerror='alert(1)'>"}
LAB:操作WebSocket消息以利用漏洞

image-20211021153358077

image-20211021153719526

image-20211021153451035

<>被客户端进行了HTML编码

拦截并修改

image-20211021153958116

image-20211021153918005

操纵WebSocket握手以利用漏洞

某些 WebSockets 漏洞只能通过操纵 WebSocket 握手来发现和利用。这些漏洞往往涉及设计缺陷,例如:

  • 错误地信任 HTTP 标头以执行安全决策,例如X-Forwarded-For标头。
  • 会话处理机制中的缺陷,因为处理 WebSocket 消息的会话上下文通常由握手消息的会话上下文决定。
  • 由应用程序使用的自定义 HTTP 标头引入的攻击面。
LAB:操纵WebSocket握手以利用漏洞

image-20211021154540171

被ban
修改连接报文在标头中加入X-Forwarded-For: 1.1.1.1重新进入聊天会话

image-20211021161711265

image-20211021162051763

使用跨站WebSockets来利用漏洞

​ 当攻击者从攻击者控制的网站进行跨域 WebSocket 连接时,就会出现一些 WebSockets 安全漏洞。这被称为跨站点 WebSocket 劫持攻击,它涉及利用WebSocket 握手中的跨站点请求伪造(CSRF) 漏洞。这种攻击通常会产生严重的影响,允许攻击者代表受害用户执行特权操作或捕获受害用户有权访问的敏感数据。

什么是跨站WebSocket劫持?

​ 跨站点 WebSocket 劫持(也称为跨源 WebSocket 劫持)涉及WebSocket 握手上的跨站点请求伪造(CSRF) 漏洞。当 WebSocket 握手请求仅依赖 HTTP cookie 进行会话处理并且不包含任何CSRF 令牌或其他不可预测的值时,就会出现这种情况。

​ 攻击者可以在自己的域中创建恶意网页,从而与易受攻击的应用程序建立跨站点 WebSocket 连接。应用程序将在受害者用户与应用程序的会话上下文中处理连接。

​ 然后攻击者的页面可以通过连接向服务器发送任意消息,并读取从服务器收到的消息内容。这意味着,与常规 CSRF 不同,攻击者获得与受感染应用程序的双向交互。

跨站WebSocket劫持有什么影响?

成功的跨站点 WebSocket 劫持攻击通常会使攻击者能够:

  • **伪装成受害者用户执行未经授权的操作。**与常规 CSRF 一样,攻击者可以向服务器端应用程序发送任意消息。如果应用程序使用客户端生成的 WebSocket 消息来执行任何敏感操作,则攻击者可以跨域生成合适的消息并触发这些操作。
  • **检索用户可以访问的敏感数据。**与常规 CSRF 不同,跨站点 WebSocket 劫持使攻击者可以通过被劫持的 WebSocket 与易受攻击的应用程序进行双向交互。如果应用程序使用服务器生成的 WebSocket 消息向用户返回任何敏感数据,则攻击者可以拦截这些消息并捕获受害用户的数据。
执行跨站点WebSocket劫持有什么影响?

​ 由于跨站点 WebSocket 劫持攻击本质上是 WebSocket 握手上的CSRF 漏洞,因此执行攻击的第一步是检查应用程序执行的 WebSocket 握手,并确定它们是否受到 CSRF 保护。就CSRF攻击的正常情况而言,通常需要找到仅依赖HTTP cookie进行会话处理并且在请求参数中不使用任何令牌或其他不可预测值的握手消息。

​ 例如,以下 WebSocket 握手请求可能容易受到 CSRF 攻击,因为唯一的会话令牌是在 cookie 中传输的:

GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, UpgradeCookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
Tips:
该Sec-WebSocket-Key头包含一个随机值,以防止缓存代理的错误,而不是用于身份验证或会话处理的目的。

​ 如果 WebSocket 握手请求易受 CSRF 攻击,则攻击者的网页可以执行跨站点请求,在易受攻击的站点上打开 WebSocket。攻击中接下来会发生什么完全取决于应用程序的逻辑以及它如何使用WebSockets。攻击可能涉及:

  • 发送 WebSocket 消息以代表受害用户执行未经授权的操作。
  • 发送 WebSocket 消息以检索敏感数据。
  • 有时,只是等待传入的包含敏感数据的消息到达
LAB:跨站点WebSocket劫持

image-20211021171233879

没有CSRF令牌

image-20211021172001218

image-20211021171938995

image-20211021172329573

如何保护WebSocket连接

为了最大限度地降低 WebSockets 产生的安全漏洞的风险,请使用以下准则:

  • 使用wss://协议(基于 TLS 的 WebSockets)。
  • 硬编码 WebSockets 端点的 URL,当然不要将用户可控的数据合并到这个 URL 中。
  • 保护WebSocket握手消息免受CSRF攻击,避免跨站WebSockets劫持漏洞。
  • 将通过 WebSocket 接收的数据视为双向不可信数据。在服务器端和客户端安全地处理数据,以防止基于输入的漏洞,例如 SQL 注入和跨站点脚本
0

评论区