基本介绍
WebSocket是一种在单个TCP连接上进行全双工通信的协议。
该通信协议于2011年被IETF定为标准RFC6455,并由RFC7936进行补充规范。此外,WebSocket API也被W3C定为标准。通过WebSocket,客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要进行一次握手,便可直接创建持久性的连接,并进行双向数据传输。
WebSocket 基础帧结构
抓包分析
WebSocket在建立连接时,HTTP通过Upgrade消息头来通知客户端需要采用WebSocket协议来完成这个请求,在发送完此响应最后的空行后,服务器就会切换到WebSocket协议,接口返回状态码为101,表示服务器已经理解了客户端的请求,需要升级协议。
在burp可以看到来回请求与响应:
在请求和响应头中包含几个字段:
Sec-WebSocket-Key ,由客户端随机生成的 16 字节值, 然后做 base64 编码, 客户端需要保证该值是足够随机, 不可被预测的 (换句话说, 客户端应使用熵足够大的随机数发生器), 在 WebSocket 协议中, 该头部字段必传, 若客户端发起握手时缺失该字段, 则无法完成握手。
Sec-WebSocket-Version ,指示 WebSocket 协议的版本, RFC 6455 的协议版本为 13, 在 RFC 6455 的 Draft 阶段已经有针对相应的 WebSocket 实现, 它们当时使用更低的版本号, 若客户端同时支持多个 WebSocket 协议版本, 可以在该字段中以逗号分隔传递支持的版本列表 (按期望使用的程序降序排列), 服务端可从中选取一个支持的协议版本。
安全问题
实际上与WebSockets有关的任何Web安全漏洞都可能出现:
传输到服务器的用户提供的输⼊可能会以不安全的方式进行处理,从而导致漏洞,例如SQL注⼊或XML外部实体注⼊。
通过WebSockets达到的某些盲目漏洞可能仅使用带外(OAST)技术才能检测到。
本地测试学习
DVWS是基于Web Socket构建的WEB程序,在该程序中构建了多了个安全漏洞的场景,例如爆破、命令执行、文件包含的漏洞场景,并且可以使用 Burp Suite 等工具进行对Web Socket测试。
靶场地址:https://owasp.org/www-project-damn-vulnerable-web-sockets
爆破
由于burp无法爆破websocket协议,为了测试编写一个爆破脚本得到账号为admin密码为123456。
命令执行
直接发送ip地址给服务器,服务器对该输⼊IP进行ping操作。直接在参数后添加拼接符合和参数。
文件包含
点击页面中的单选框,点击请求后,呈现的数据不⼀样。
在websocket中显示的请求内容是:
pages/games.txt
pages/books.txt
使用burp进行测试,../../../etc/passwd,
当然还可以读取其他有意思的文件比如说
/root/.ssh/id_rsa、/etc/mtab 、/var/lib/
mlocate/mlocate.db、/root/.bash_history 等
WebSocket⻛险防御
WebSocket在实际使用中可能存在一些安全风险,需要进行相应的防御措施。
1. 使用 wss:// 协议(基于TLS的WebSockets)。
2. 硬编码WebSockets终结点的URL,当然不要将用户可控制的数据合并到此URL中。
3. 双向将通过WebSocket接收的数据视为不可信。在服务器和客户端上安全地处理数据,以防止基于输⼊的漏洞,例如SQL注⼊和跨站点脚本。
4. 在客户端和服务器端都要对接收和发送的数据进行严格的输入验证和输出转义,确保不会执行恶意脚本。
|