1. WebSocket协定
    1.1 简介
    WebSocket协定是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工(full-duplex)通信,即容许服务器被动发送信息给客户端。因而,在WebSocket中,客户端和服务器只须要实现一次握手,两者之间就间接能够创立持久性的连贯,并进行双向数据传输,这样也使得客户端和服务器之间的数据交换变得更加简略。

 
1.2 特点
WebSocket特点如下:

较少的管制开销。在连贯建设后,服务器和客户端之间替换数据时,用于协定管制的数据包头部绝对较小。在不蕴含扩大的状况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度无关);对于客户端到服务器的内容,此头部还须要加上额定的4字节的掩码。

更强的实时性。因为协定是全双工的,所以服务器能够随时被动给客户端下发数据。

放弃连贯状态。与HTTP不同的是,Websocket须要先建设连贯,这就使得其成为一种有状态的协定,之后通信时能够省略局部状态信息。而HTTP申请可能须要在每个申请都携带状态信息(如身份认证等)。

更好的二进制反对。Websocket定义了二进制帧,绝对HTTP,能够更轻松地解决二进制内容。

能够反对扩大。Websocket定义了扩大,用户能够扩大协定、实现局部自定义的子协定。

更好的压缩成果。绝对于HTTP压缩,Websocket在适当的扩大反对下,能够沿用之前内容的上下文,在传递相似的数据时,能够显著地进步压缩率。

1.3 WebSocket 和 HTTP 的区别

 

HTTP 是一个无状态的协定,使客户端向服务器申请资源,并从服务器接管响应。客户端应用 HTTP 申请/响应语法,即申请发送到服务器之后,服务器向客户端返回 HTML 文件、图像和其余媒体内容。

WebSocket 通信协议尝试在较大范畴内改良 Web 实时通信和插件技术,并提供全双工、基于事件的通信而无需采纳低效的轮询形式。开发人员能够从 Web 浏览器的 JS 端轻松地创立 WebSocket 连贯并发送数据,进而实现应用程序的实时数据传输的实现。

因为 WebSocket 是面向音讯的,因而它更加实用于实时通信,而 HTTP 更实用于申请和服务器-客户端通信的响应。

  1. WebSocket API
    Websocket 应用 ws 或 wss 的对立资源标志符(URI),其中 wss 示意应用了 TLS 的 Websocket,相似于HTTP协定的http和https。wss协定通过TLS连贯建设一个WebSocket,即加密传输;ws协定即明文传输。
     
    ws://echo.websocket.org
    wss://echo.websocket.org
    WebSocket API与传统API一样都是由通信协议、域名、版本号、门路、申请参数等因素组成,只是因为WebSocket API在实现握手流程之后,客户端和服务端之间就创立了持久性的连贯,并且能够间接用文本音讯或者二进制音讯进行通信的数据交互,这样咱们在WebSocket API流量报文中看到的个别都是JSON格局文本音讯。
    从开发的角度,WebSocket API还包含了:

构造函数,构造函数的语法示例为:const myWebSocket = new WebSocket(url [, protocols]),其中url示意连贯的 URL;protocols示意为一个协定字符串或者一个蕴含协定字符串的数组,为可选。

属性:属性分为很多次要有bufferedAmount,示意未发送至服务器的字节数;onopen,示意用于指定连贯胜利后的回调函数,等等。

办法:办法次要分为close和send,别离示意WebSocket敞开连贯和数据传入服务器。

事件:事件次要有close、error、message、open。

  1. WebSocket API业务场景
    WebSocket API作为一种重要客户端-服务器通信接口,到底在哪些业务场景下可能用到WebSocket API呢?次要分为三大类:

实时数据更新的应用程序:对于一些须要服务端一直发送数据在客户端实时显示的利用,应用WebSocket API作为数据传输接口无疑是最好的抉择。

游戏应用程序:在游戏利用中,个别的场景是服务器须要一直接收数据,无需刷新UI,传输的数据就会在屏幕上失效,UI也会主动刷新,不须要建设新的连贯。

聊天应用程序:聊天应用程序个别会有较长的连贯状态,以不便用户与用户之间的实时交换,采纳WebSocket API只需建设一次连贯便能够实现一对一的音讯传输,并且放弃长时间的通信连贯。

具体业务场景列举:

 

  1. WebSocket API平安危险
    WebSocket API的平安危险次要分为两大类:惯例攻打危险和特有攻打危险。以下是这两大类危险的具体解读。
    4.1 WebSocket API惯例攻打危险
    (1)音讯体输出破绽
    和HTTP协定一样,WebSocket API在传输音讯的时候个别采纳json格局传输文本,所以对于音讯体中参数仍然能够能够进行SQL注入、XSS、命令执行、文件读取、SSFR、任意文件上传......等惯例输出性破绽攻打。

 
破绽案例:
在线聊天利用中应用WebSocket API在客户端和服务端之间传输音讯。当一个用户输出聊天音讯时,如下的一个WebSocket音讯被发送到服务端:


服务端会将这个音讯内容通过WebSocket API转发给另外一个用户,而后在另一个用户的浏览器中被JS渲染为一段HTML代码。

当服务器没有对转发的内容做平安进攻或过滤时,通过批改WebSocket API音讯体施行xss攻打。


(2)身份认证绕过
WebSocket API没有规定服务器在握手阶段应该如何认证客户端身份。服务器能够采纳任何 HTTP 服务器的客户端身份认证机制,如 cookie认证,HTTP 根底认证,TLS 身份认证等,在WebSocket API在身份认证面临的攻打危险和传统的API面临的危险是一样的,因而WebSocket API同样面临着OWASP API 2023十大平安危险中的API2:身份认证生效危险。

 
(3)受权生效
同身份认证一样,WebSocket API没有明确指定任何受权形式,API中用户资源拜访等的受权策略由服务端或开发者实现。WebSocket API也会存在和传统Web利用雷同的平安危险,如:垂直越权、程度越权、未受权拜访等等平安危险。所以WebSocket API同样面临OWASP API 2023十大平安危险中API1:对象级别受权生效、API3:对象属性级别受权生效、API5:性能级别受权生效的平安危险。

 
(4)拒绝服务
WebSocket API同样易蒙受拒绝服务攻打,其面临危险分为客户端拒绝服务危险和服务端拒绝服务危险。

客户端拒绝服务:WebSocket 连贯限度不同于HTTP连贯限度,WebSocket有一个更高的连贯限度,不同的浏览器的最大连接数也存在差别,通过发送歹意内容,占用所有Websocket,导致浏览器资源耗尽,引起拒绝服务。

服务端拒绝服务:WebSocket建设的是长久连贯,只有客户端或服务端其中一方发动敞开连贯的申请,连贯才会敞开。攻击者能够通过发动申请并建设大量的连贯,导致服务器资源耗尽,引发拒绝服务攻打。

4.2 WebSocket API 特有攻击面
(1)跨站WebSockets劫持
在WebSocket API发动WebSocket握手申请时,浏览器会在申请中增加一个名为Origin的HTTP头,Oringin字段示意发动申请的源,以此来避免未经受权的跨站点拜访申请。WebSocket 标准中没有强制规定握手阶段的 Origin 头是必须的,且WebSocket不受浏览器同源策略的限度。如果服务端没有针对Origin头部进行验证可能会导致跨站点WebSocket劫持攻打,当WebSocket握手申请仅依附HTTP cookie进行会话解决并且不蕴含任何CSRF token或其余不可预测的值时,也有可能会造成这种破绽。这攻打危险相似于JSONP劫持,是属于CSRF攻打的一种。
破绽示例:
通过实时聊天发送聊天音讯:

 
在WebSocket握手申请中发现仅仅是靠cookie进行会话解决,并没有CSRF的防护伎俩。


查看WebSocket历史音讯记录。


在浏览器中找到破绽利用服务器。

 
同时咱们在burp设置一个burp client,这里模仿的是攻击者。
 

 
在破绽利用服务器中贴入利用JS代码。

 
破绽利用服务器并将破绽利用程序传递给受害者,而后在攻击者也就是咱们创立的burp client中返回了受害者相干敏感信息。

 
解码发现用户登陆凭证。


(2)中间人攻打
同样是呈现在操控WebSocket握手流程时的攻打危险,能够通过获取并篡改WebSocket握手申请,施行以下攻打:
通过伪造客户端信息与服务器建设WebSocket连贯;无条件信赖HTTP头,导致某些安全策略能够被绕过。例如:X-Forwarded-For头,XSS绕过WAF;应用程序自定义的HTTP标头引入的攻击面。
破绽案例:
在线聊天中应用了XSS攻打之后,攻打已被阻止,并且WebSocket 连贯已终止。

 
拦挡WebSocket 握手申请并应用X-Forwarded-For头来绕过黑名单。

 
始终采纳这种形式进行绕过后,等到聊天框从新呈现就阐明绕过了黑名单的检测,并且能够施行xss攻打,后续步骤能够参考上述音讯体输出破绽攻打中的案例。

 
4.3 平安危险总结
实际上,简直所有的Web破绽都有可能呈现在WebSocket中。因为,WebSocket实质上就是一个通过HTTP建设连贯的双向全双工的通信协议而已,但因为其相比HTTP多了一“工”的个性,可能会呈现一些WebSocket API特有的攻打场景。所以,WebSocket API除了面临着传统API的平安危险之外,还有容易蒙受因为本人特殊性而产生的攻打,这些攻打来自于WebSocket API的握手申请流程。
 
对于Portal Lab
星阑科技 Portal Lab 致力于前沿平安技术钻研及能力工具化。次要钻研方向为API 平安、利用平安、攻防反抗等畛域。实验室成员研究成果曾发表于BlackHat、HITB、BlueHat、KCon、XCon等国内外出名平安会议,并屡次公布开源平安工具。将来,Portal Lab将持续以凋谢翻新的态度踊跃投入各类平安技术钻研,继续为平安社区及企业级客户提供高质量技术输入。