WebSockets安全漏洞测试
翻译
原文:https://portswigger.net/web-security/websockets
- name: 翻译
desc: 原文:https://portswigger.net/web-security/websockets
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 0WebSockets安全漏洞测试
在本节中,我们将介绍如何操作 WebSocket 消息和连接,描述 WebSocket 可能产生的安全漏洞类型,并提供一些利用 WebSocket 漏洞的示例。
# 1WebSockets
WebSockets 广泛应用于现代 Web 应用程序。它们通过 HTTP 启动,并提供具有 双向异步通信 的长期连接。
WebSocket 可用于各种目的,包括执行用户操作和传输敏感信息。实际上,常规 HTTP 中出现的任何 Web 安全漏洞也可能出现在 WebSockets 通信中。
实验室
如果您已经熟悉基于 WebSockets 漏洞背后的基本概念,并且只想在一些实际的、易受攻击的目标上练习和利用它们,那么您可以从下面的链接访问本主题中的所有实验室。
# 2操纵WebSocket流量
查找 WebSocket 安全漏洞通常涉及 - 以应用程序不期望的方式操作它们。你可以使用 Burp Suite 来执行此操作。
你可以使用 Burp Suite 来:
- 拦截和修改WebSocket消息。
- 重放并生成新的WebSocket消息。
- 操纵WebSocket连接。
# 2.1拦截和修改WebSocket消息
你可以使用 Burp Proxy 拦截和修改 WebSocket 消息,如下所示:
- 打开Burp的浏览器。
- 浏览到使用 WebSocket 的应用程序功能。你可以通过使用该功能,并在 Burp Proxy 的 WebSockets 历史记录选项卡里查找出现在其中的条目,来确定该应用程序是否正在使用 WebSocket。
- 在 Burp Proxy 的 “interception” 选项卡中,确保已打开拦截。
- 当从浏览器或服务器发送 WebSocket 消息时,它将显示在 “Intercept” 选项卡中,以供你查看或修改。按 “Forward” 按钮可以转发消息。
笔记
你可以配置是在 Burp 代理中截获客户端到服务器还是服务器到客户端的消息。该功能可以在 “Settings” 对话框的 “WebSocket interception rules (opens new window)” 一栏中进行设置。
(((译者加:在 2023 版本的 BurpSuite 中,点击右上角“小齿轮Settings” --> “Tools” --> “Proxy” --> “WebSocket interception rules”
就可以找到该设置)))
# 2.2重放并生成新的WebSocket消息
除了实时拦截和修改 WebSocket 消息之外,你还可以重放单个消息并生成新消息。你可以使用 Burp Repeater 来执行此操作:
- 进入 Burp Proxy,在 “WebSockets history” 或 “Intercept” 选项卡中选择一条消息,然后从上下文菜单中选择 “Send to Repeater”。
- 在 Burp Repeater 中,你现在可以编辑所选择的消息,并反复发送。
- 你可以输入一条新消息,然后将其发送到客户端或服务器。
- 在 Burp Repeater 的 “History” 面板中,你可以查看通过 WebSocket 连接来传输消息的历史记录。这包括你在 Burp Repeater 中生成的消息,以及浏览器或服务器通过同一连接生成的消息。
- 如果要编辑和重新发送历史面板中的任何消息,可以选中消息并从上下文菜单中选择 “Edit and resend” 来实现。
# 2.3操纵WebSocket连接
除了操纵 WebSocket 消息外,有时还需要操纵建立连接的WebSocket握手 (opens new window)。
可能需要操纵 WebSocket 握手的各种情况:
- 它可以使你获得更多的攻击面。
- 某些攻击可能会导致你的连接中断,因此你需要建立新的连接。
- 原始握手请求中的令牌 或 其他数据可能已经过期,需要更新。
你可以使用 Burp Repeater 来操纵 WebSocket 握手:
- 如前所述 (opens new window),向 Burp Repeater 转发 WebSocket 消息。
- 在 Burp Repeater 中,单击 WebSocket URL 旁边的铅笔图标。这将打开一个向导,允许你附加到现有连接的WebSocket、克隆已连接的 WebSocket、或重新连接到已断开连接的 WebSocket。
- 如果你选择克隆已连接的 WebSocket 或重新连接到已断开连接的 WebSocket,则向导会显示 WebSocket 握手请求的完整详细信息,你可以在执行握手之前,根据需要对其进行编辑。
- 当你单击 “Connect” 时,Burp 将尝试执行所配置的握手并显示结果。如果成功建立了新的 WebSocket 连接,你可以使用它在 Burp Repeater 中发送新消息。
# 3WebSockets安全漏洞
原则上来讲,几乎任何 Web 安全漏洞都可能在 WebSockets 中出现:
- 用户所提供的输入,在传输到服务器上时,可能会以不安全的方式进行处理,从而导致 SQL注入 或 XML外部实体注入等漏洞。
- 一些通过 WebSockets 的盲性漏洞,也许只能使用带外(OAST)技术 (opens new window)来检测。
- 如果攻击者控制的数据通过 WebSocket 传输给其他应用程序用户,则可能导致 XSS 或其他客户端漏洞。
# 3.1操纵WebSocket消息以利用漏洞
大多数影响 WebSocket 的基于输入的漏洞,都可以通过篡改 WebSocket 消息的内容 (opens new window)来发现和利用。
例如,假设聊天应用程序使用 WebSocket 在浏览器和服务器之间发送聊天消息。当用户键入聊天消息时,将会向服务器发送如下所示的 WebSocket 消息:
{"message":"Hello Carlos"}
消息的内容将(再次通过 WebSocket)传输给另一个聊天用户,并在用户的浏览器中呈现,如下所示:
<td>Hello Carlos</td>
在这种情况下,如果没有其他输入处理或防御措施,攻击者可以通过提交以下 WebSocket 消息来执行 XSS 攻击概念验证:
{"message":"<img src=1 onerror='alert(1)'>"}
- name: 实验室-学徒
desc: 操纵WebSocket消息以利用漏洞 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/websockets/lab-manipulating-messages-to-exploit-vulnerabilities
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 3.2操纵WebSocket握手以利用漏洞
某些 WebSocket 漏洞只能通过操纵 WebSocket 握手 (opens new window)来发现和利用。这些漏洞往往涉及设计缺陷,例如:
- 对执行安全决策的 HTTP 标头进行错误的信任,例如
X-Forwarded-For
标头。 - 会话处理机制中的缺陷,因为处理 WebSocket 消息的会话上下文 通常由握手消息的会话上下文确定。
- 由应用程序使用的自定义 HTTP 标头引入的攻击面。
- name: 实验室-从业者
desc: 操纵WebSocket握手以利用漏洞 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/websockets/lab-manipulating-handshake-to-exploit-vulnerabilities
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 3.3使用跨站点WebSockets来利用漏洞
当攻击者从其控制的网站建立跨域 WebSocket 连接时,会出现一些 WebSocket 安全漏洞。这被称为跨站点 WebSocket 劫持 (opens new window)攻击,它涉及利用 WebSocket 握手上的跨站请求伪造(CSRF) (opens new window)漏洞。这种攻击通常会产生严重的影响,其允许攻击者代表受害用户执行特权操作,或捕获受害用户有权访问的敏感数据。
# 4如何建立安全的WebSocket连接
若想最大限度地降低 WebSockets 出现安全漏洞的风险,请遵循以下准则:
- 使用
wss://
协议(基于 TLS 的 WebSockets)。 - 对 WebSockets 端点的 URL 进行硬编码,当然了,不要将用户可控制的数据合并到此 URL 中。
- 针对 WebSocket 握手消息实施 CSRF 保护,避免跨站点 WebSocket 劫持漏洞。
- 在两个方向上,将 WebSocket 接收的数据都视为不可信。在服务器端和客户端安全地处理数据,以防止基于输入的漏洞,例如 SQL 注入和跨站脚本。