测试WebSocket安全漏洞
Last updated
Last updated
在本节中,我们将讲解如何操作WebSocket消息和连接,描述WebSocket可能产生的安全漏洞类型,并举例说明如何利用WebSocket漏洞。
WebSocket广泛用于现代Web应用中。WebSocket通过HTTP启动,提供双向异步通信的长连接。
WebSocket可用于各种用途,包括执行用户操作和传输敏感信息。几乎所有在常规HTTP中出现的Web安全漏洞都有可能出现在WebSocket通信中。
阅读更多
Labs
如果你已经熟悉WebSocket漏洞背后的基本概念,并且只想在一些真实的、故意易受攻击的目标上练习利用它们,你可以从下面的链接访问本主题中的所有实验。
发现WebSocket安全漏洞通常需要以应用程序未预期的方式对其进行操作。你可以使用Burp Suite来实现这一点。
你可以使用Burp Suite来:
拦截并修改WebSocket消息。
重放并生成新的WebSocket消息。
操作WebSocket连接。
你可以使用Burp Proxy拦截并修改WebSocket消息,具体如下:
打开Burp的浏览器。
浏览使用WebSocket的应用程序功能。你可以通过使用应用程序并查找Burp Proxy中的WebSocket history选项卡中出现的条目来确定WebSocket正在被使用。
在Burp Proxy的Intercept选项卡中,确保拦截已经打开。
当浏览器或服务器发送WebSocket消息时,它将显示在Intercept选项卡中,以供你查看或修改。按Forward按钮以转发消息。
注意
你可以配置Burp Proxy拦截客户端到服务器或服务器到客户端的消息。在Settings对话框中的WebSocket interception rules设置中进行配置。
除了实时拦截和修改WebSocket消息外,还可以重放单个消息并生成新的消息。你可以使用Burp Repeater来实现这一点。
在Burp Proxy中,选择WebSockets history或Intercept选项卡的一条消息,然后从上下文菜单中选择“发送到Repeater”。
在Burp Repeater中,你可以编辑之前选定的消息,并重复地发送。
你可以输入新的消息,并将其发送到客户端或服务器。
在Burp Repeater的“History”面板中,你可以查看通过WebSocket连接传输的消息历史记录。包括你在Burp Repeater中生成的消息,以及浏览器或服务器通过同一连接生成的任何消息。
如果要编辑并重新发送历史面板中的任何消息,你可以选择该消息并从上下文菜单中选择“Edit and resend”。
除了操作WebSocket消息外,有时还需要操作建立连接的WebSocket握手。
在多种情况下,可能需要对WebSocket握手进行操作:
这样可以扩大攻击面。
有些攻击可能导致你的连接中断,因此你需要建立一个新的连接。
原始握手请求中的令牌或其他数据可能已过期,需要更新。
你可以使用Burp Repeater操作WebSocket握手:
如前所述,将WebSocket消息发送到Burp Repeater。
在Burp Repeater中,点击WebSocket URL旁边的铅笔图标。这将打开一个向导,让你可以连接到一个现有已连接的WebSocket、克隆一个已连接的WebSocket或重新连接到一个已断开的WebSocket。
如果你选择克隆一个已连接的WebSocket或重新连接到一个已断开的WebSocket,那么向导将显示WebSocket握手请求的全部详细信息,你可以在进行握手前根据需要对其进行编辑。
点击“Connect”后,Burp将尝试执行配置的握手并显示结果。如果成功建立了一个新的WebSocket连接,你就可以使用它在Burp Repeater中发送新的消息。
原则上,几乎所有Web安全漏洞都可能与WebSocket有关:
传输到服务器的用户输入可能会以不安全的方式进行处理,从而导致SQL注入或XML外部实体注入等漏洞。
一些通过WebSocket实现的盲漏洞可能只能使用带外(OAST)技术才能检测到。
如果攻击者控制的数据通过WebSocket传输给其他应用程序用户,则可能导致XSS或其他客户端漏洞。
大多数影响WebSocket的基于输入的漏洞都可以通过篡改WebSocket消息的内容来发现和利用。
例如,假设一个聊天应用程序使用WebSocket在浏览器和服务器之间发送聊天消息。当用户输入一条聊天信息时,一个类似如下的WebSocket消息会发送到服务器:
消息的内容将(再次通过WebSocket)传输给另一位聊天用户,并在该用户的浏览器中呈现如下:
在这种情况下,只要没有其他的输入处理或防御措施,攻击者就可以通过提交如下WebSocket消息来进行一个概念验证的XSS攻击:
LAB
一些WebSocket漏洞只能通过操作WebSocket握手来发现和利用。这些漏洞往往牵扯设计缺陷,例如:
错误地信任HTTP标头来执行安全决策,比如X-Forwarded-For
标头。
会话处理机制的缺陷,因为处理WebSocket消息的会话上下文通常由握手消息的会话上下文决定。
由应用程序使用的自定义HTTP标头引入的攻击面。
LAB
一些WebSocket安全漏洞在攻击者从其控制的网站发起跨域WebSocket连接时出现。这被称为跨站WebSocket劫持攻击,它涉及在WebSocket握手上利用跨站请求伪造漏洞。这种攻击通常具有严重的影响,允许攻击者代表受害用户执行特权操作或捕获受害用户能够访问的敏感数据。
阅读更多
为了尽量降低WebSocket产生安全漏洞的风险,请使用以下指南:
使用wss://
协议(基于TLS的WebSocket)。
硬编码WebSocket端点的URL,并且一定不要将用户可控的数据合并到这个URL。
保护WebSocket握手消息免受CSRF攻击,以避免跨站WebSocket劫持漏洞。
将通过WebSocket接收到的数据在两端都视为不受信任的数据。在服务器和客户端两端安全地处理数据,以防止基于输入的漏洞,如SQL注入和跨站脚本。