WebSocket Attacks
什么是 WebSockets
WebSocket 连接是通过初始的 HTTP 握手建立的,并且被设计为长期存在,允许在任何时候进行双向消息传递,无需事务系统。这使得 WebSockets 特别适用于需要低延迟或服务器发起的通信的应用,比如实时金融数据流。
建立 WebSocket 连接
有关建立 WebSocket 连接的详细说明,请访问此处。简而言之,WebSocket 连接通常是通过客户端 JavaScript 发起的,如下所示:
wss
协议表示通过 TLS 加密的 WebSocket 连接,而 ws
表示一个未加密的连接。
在建立连接时,浏览器和服务器之间会通过 HTTP 执行握手。握手过程涉及浏览器发送请求,服务器做出响应,如下例所示:
浏览器发送握手请求:
服务器的握手响应:
WebSocket握手的关键点:
Connection
和Upgrade
头部信号启动WebSocket握手。Sec-WebSocket-Version
头部指示所需的WebSocket协议版本,通常为13
。在
Sec-WebSocket-Key
头部中发送一个Base64编码的随机值,确保每次握手都是独一无二的,有助于防止缓存代理出现问题。这个值不是用于身份验证,而是用于确认响应不是由配置错误的服务器或缓存生成的。服务器响应中的
Sec-WebSocket-Accept
头部是Sec-WebSocket-Key
的哈希值,验证服务器打算打开WebSocket连接的意图。
这些特性确保握手过程安全可靠,为高效的实时通信铺平道路。
或者创建一个websocat服务器:
中间人攻击 websocket 连接
如果发现客户端从当前本地网络连接到一个 HTTP websocket,你可以尝试进行 ARP Spoofing 攻击 来在客户端和服务器之间执行中间人攻击。 一旦客户端尝试连接到你,你可以使用:
Websockets枚举
您可以使用工具https://github.com/PalindromeLabs/STEWS自动发现、指纹识别和搜索websockets中已知的漏洞。
Websocket调试工具
Burp Suite支持MitM方式拦截websockets通信,与拦截常规HTTP通信的方式非常相似。
socketsleuthBurp Suite扩展将允许您通过获取历史记录、设置拦截规则、使用匹配和替换规则、使用Intruder和AutoRepeater更好地管理Burp中的Websocket通信。
WSSiP:简称“WebSocket/Socket.io代理”,这个用Node.js编写的工具提供了一个用户界面,用于捕获、拦截、发送自定义消息,并查看客户端和服务器之间的所有WebSocket和Socket.IO通信。
wsrepl是一个专为渗透测试设计的交互式websocket REPL。它提供了一个界面,用于观察传入的websocket消息并发送新消息,并提供了一个易于使用的框架来自动化这种通信。
https://websocketking.com/是一个用于使用websockets与其他网站进行通信的网站。
https://hoppscotch.io/realtime/websocket除了其他类型的通信/协议外,它还提供了一个用于使用websockets与其他网站进行通信的网站。
Websocket实验室
在Burp-Suite-Extender-Montoya-Course中,您可以找到一个使用websockets启动web的代码,在此文章中可以找到解释。
跨站点WebSocket劫持(CSWSH)
跨站点WebSocket劫持,也称为跨源WebSocket劫持,被确定为影响WebSocket握手的特定**跨站点请求伪造(CSRF)的一种情况。当WebSocket握手仅通过HTTP cookie进行身份验证而没有CSRF令牌**或类似的安全措施时,就会出现此漏洞。
攻击者可以利用这一点,托管一个恶意网页,该网页发起与易受攻击应用程序的跨站WebSocket连接。因此,此连接被视为受害者与应用程序会话的一部分,利用会话处理机制中缺乏CSRF保护。
简单攻击
请注意,在建立****websocket连接时,cookie会发送到服务器。服务器可能会使用它来关联每个特定的用户与其基于发送cookie的websocket会话。
然后,例如,如果websocket 服务器在发送包含“READY”消息的情况下返回用户的对话历史记录,那么通过简单的XSS建立连接(cookie将被自动发送以授权受害者用户),发送“READY”将能够检索对话的历史记录。
跨域 + 具有不同子域的 Cookie
在这篇博文https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/中,攻击者成功在进行 Websocket 通信的域的子域中执行任意 JavaScript。由于它是一个子域,cookie被发送,并且由于Websocket 没有正确检查来源,因此可以与其通信并从中窃取令牌。
从用户那里窃取数据
复制您想要冒充的 Web 应用程序(例如 .html 文件),并在进行 Websocket 通信的脚本中添加此代码:
现在从https://github.com/skepticfx/wshook下载wsHook.js
文件,并将其保存在包含网页文件的文件夹中。
暴露网页应用程序并让用户连接到它,您将能够通过websocket窃取发送和接收的消息:
竞争条件
WebSockets中的竞争条件也是一个问题,查看此信息以了解更多。
其他漏洞
由于WebSockets是一种将数据发送到服务器端和客户端的机制,取决于服务器和客户端如何处理信息,WebSockets可以被用来利用其他几种漏洞,如XSS、SQLi或使用来自WebSockets的用户输入的任何其他常见Web漏洞。
WebSocket劫持
这种漏洞可能允许您通过让反向代理认为已建立了WebSocket通信(即使事实并非如此)来绕过反向代理的限制。这可能允许攻击者访问隐藏的端点。有关更多信息,请查看以下页面:
Upgrade Header Smuggling参考资料
最后更新于