WebSockets笔记
个人总结
参考:https://portswigger.net/web-security/websockets
- name: 个人总结
desc: 参考:https://portswigger.net/web-security/websockets
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# WebSockets笔记
# 1WebSockets基本知识
# 1、什么是WebSockets?
答案
- WebSockets 是一种通过 HTTP 发起的双向全双工通信协议;
- WebSockets 可以用于传输异步流量,实现实时异步通信;
- 浏览器和服务器只需要完成一次握手,两者之间就可以打开交互式通信会话,建立持久性的长期连接,并进行双向数据传输(浏览器能发数据给服务器,服务器也能反过来发数据给浏览器)。
# 2、WebSockets和HTTP之间有什么区别?
答案
HTTP:
- 是大多数 Web 浏览器和 Web 站点之间的通信协议;
- 通过 HTTP,客户端可以向服务端发送请求;
- 请求的生存期很短,每次请求都会建立一个新的连接,且会立即生成响应;
- 多请求,多连接,单向即时传输。
WebSockets:
- 通过 HTTP 发起,建立在 HTTP 协议之上,用于实现某些特定的流量传输需求;
- 通过 WebSockets 可以建立双向通信,客户端可以向服务端发送请求,服务端也可以向客户端发送请求;
- 请求的生存期很长,通过一个请求完成握手,就可以建立一个持久性的连接,连接会保持打开和空闲状态,等待任意一方(客户端或服务端)主动发送数据;
- 单请求,单个持久性连接,双向异步传输。
# 3、如何建立WebSockets连接?
答案
一般通过客户端 JavaScript 创建连接:var ws = new WebSocket("wss://<服务器地址>/abc")
ws://
是普通的 WebSocket 协议,相当于http://
wss://
是经过 TLS 加密的 WebSockets 协议,相当于https://
建立连接后,通过客户端 JavaScript,从浏览器方向 往 服务器发送一条简单的消息:ws.send("数据");
# 4、有哪些标头可用于WebSockets?这些标头分别有什么作用?
请求和响应示例:
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
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
2
3
4
5
6
7
8
9
10
11
12
答案
通用标头:
Connection: Upgrade
和Upgrade: websocket
这两个标头,表明当前 HTTP 请求是一次 WebSocket 握手。
请求标头:
Sec-WebSocket-Version: 13
指定了客户端希望使用的 WebSocket 协议版本,这通常都为13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
包含一个经过 Base64 编码的随机值,该值在每次握手请求中都需要随机生成;注意,该标头不会用于身份验证 或 会话处理等目的
响应标头:
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
包含了请求标头Sec-WebSocket-Key
所提交值的散列,该散列还与特定的字符串连接,最后才给到响应标头。这样做是为了防止 因服务器配置错误或缓存代理 而导致的误导性响应
# 5、WebSockets消息中可以包含什么内容?
答案
原则上,WebSocket 消息可以包含任何内容或数据格式。在现代应用程序中,JSON (opens new window) 通常用于在 WebSocket 消息中发送结构化数据。
# 6、WebSockets和Socket一样吗?它们之间有什么区别?
答案
两者的区别有点多,推荐一篇讲Socket的文章 (opens new window)。下面只列举两者之间的部分区别:
WebSockets:
- 一种基于 HTTP 的全新协议;
- 在客户端和服务端之间建立双向通信;
- 通过建立 WebSockets 连接,可以在任意一端(客户端或服务端)收发数据。
Socket(套接字):
- 一种从 TCP 中抽象出来的网络接口;
- 在程序与程序之间建立双向通信;
- 通过建立 Socket 连接,程序可以通过其进行收发数据、IO 操作(打开、读写、关闭)等动作。
# 2WebSockets安全漏洞
# 1、WebSockets会产生什么安全漏洞?
答案
原则上来讲,几乎任何 Web 安全漏洞都可能在 WebSockets 中出现。WebSockets 是建立在 HTTP 上的一种数据传输协议,只是单纯用来传输数据的,对于安全漏洞的出现并没有决定性的因素。
- 如果 WebSockets 将数据传递到服务器,而服务器没有以安全的方式处理数据,则可能产生服务端漏洞
- 如果 WebSockets 将数据传递给其他应用程序用户,则可能产生客户端漏洞
# 2、有哪些利用WebSockets漏洞的方式?
答案
- 操纵 WebSockets 消息
- 操纵 WebSockets 握手
- 跨站点 WebSockets 劫持
# 3、通过WebSockets来传输数据很安全?
判断。
答案
错误。WebSockets 只是一种新型的数据传输协议和方式,并不提供安全方面的保护。
# 4、什么是跨站点WebSockets劫持(CSWSH)?
答案
跨站点 WebSockets 劫持(CSWSH)是由 WebSocket 握手请求中的 CSRF 漏洞造成的一种攻击方式。
当 WebSocket 握手请求仅依赖 HTTP cookie 进行会话处理,并且不包含任何 CSRF 令牌或其他不可预测的值时,就会出现这种情况。这涉及 WebSocket 握手上的 CSRF 漏洞利用。该攻击允许你代表受害用户执行特权操作,或捕获受害用户有权访问的敏感数据等。
然后,攻击者的页面可以通过该连接,向服务器发送任意消息,并读取从服务器接收回来的消息内容。
# 5、跨站点WebSockets劫持和普通的CSRF之间有什么联系和区别?
答案
CSRF:
- 漏洞产生地点:无 CSRF 防护的某个功能点中;
- 载荷:攻击者构造 CSRF 载荷,然后将其投递给受害用户,攻击过程发生在用户会话层面;
- 单向性:CSRF 可以诱使受害者发出请求,但攻击者无法检索响应;
- 危害:伪装成受害用户并执行未经授权的操作。
跨站点WebSockets劫持:
- 漏洞产生地点:无 CSRF 防护的 WebSockets 握手请求中;
- 载荷:攻击者可以在自己的域上创建恶意网页,从而与目标应用程序建立跨域 WebSocket 连接,该连接建立在用户会话层面;
- 双向性:攻击者通过该连接,可以向服务器发送任意消息,并读取从服务器接收回来的消息内容。这与常规的 CSRF 不同,攻击者获得了与受损应用程序的双向交互;
- 危害-1:与常规 CSRF 一样;
- 危害-2:与常规 CSRF 不同,跨站点 WebSockets 劫持攻击具有双向性,可以读取来自服务器的任何响应内容,可以检索用户有权访问的敏感数据。
WebSockets + CSRF 组合拳,形成跨站 WebSockets 劫持攻击(升级版的 CSRF 漏洞)。
# 3防御措施
# 1、如何建立安全的WebSocket连接
答案
- 使用
wss://
协议来建立 WebSockets 连接(经过 TLS 加密),而非ws://
; - 对 WebSockets 端点的 URL 进行硬编码,同时不要把用户可控数据合并到此 URL 中;
- 针对 WebSockets 握手消息实施 CSRF 保护,防止跨站点 WebSockets 劫持漏洞;
- 在两个传输方向上,将来自对方的数据都视为不可信,就和平常的 HTTP 传输一样,客户端与服务端都要做好相应的防护措施。