1.1 HTTP 和 WebScoket
1.2 Demo
-
安装依赖
-
server.js
const WebSocket = require('ws');
// 引用Server类:
const WebSocketServer = WebSocket.Server;
// 实例化:
const ws = new WebSocketServer({
port: 3000
});
// connection事件用于处理接入的WebSocket
ws.on('connection', function (ws) {
console.log("Connected!!!");
});
-
client
1.3 握手过程
<body>
<script>var ws = new WebSocket("ws://127.0.0.1:3000");</script>
Loaded!!
</body>
</html>
Host: 127.0.0.1:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.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: http://127.0.0.1
Sec-WebSocket-Key: 8PbhQOV5ykV3eYf2biw52A==
Connection: keep-alive, Upgrade
Sec-Fetch-Dest: websocket
Sec-Fetch-Mode: websocket
Sec-Fetch-Site: same-site
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: dBaGq6Oh1nXvQd+sJRKFK9GnsGI=
<body>
<script>
var ws = new WebSocket("ws://127.0.0.1:3000");
// 连接打开事件
ws.onopen = function() {
// 发送数据给服务端
ws.send(JSON.stringify({"message":"hello"}));
};
// 监听服务端信息
ws.onmessage = function(e){
alert(e.data);
};
</script>
Loaded!!
</body>
</html>
const WebSocket = require('ws');
// 引用Server类:
const WebSocketServer = WebSocket.Server;
// 实例化:
const ws = new WebSocketServer({
port: 3000
});
// connection事件用于处理接入的WebSocket
ws.on('connection', function (ws) {
// 处理客户端的消息
ws.on('message', function (data) {
console.log(JSON.parse(data));
});
// 向客户端发送消息
ws.send("OK");
});
-
Connection和Upgrade头部用来标识这是一个WebSocket握手消息。 -
Sec-WebSocket-Version请求头明确了一个客户端希望使用的WebSocket协议版本。版本13最常用。 -
Sec-WebSocket-Key请求头包含了一个base64编码的随机值,在每个WebSocket握手请求中,它一定是随机生成的。 -
Sec-WebSocket-Accept响应头的值是客户端发送的握手请求中Sec-WebSocket-key的哈希值,并与协议规范中定义的特定字符串连接。这样做的目的是匹配每一对握手请求,防止由于错误的配置或者缓存代理导致的连接错误。
1.4 握手过程
-
聊天机器人 -
弹幕 -
协同编辑 -
股票报价实施更新 -
位置更新 -
直播实况段落的首行要
2.1 Web漏洞
2.1.1 XSS
2.2 WebSocket 安全
2.2.1 认证
-
CVE-2015-0201
-
CVE-2015-1482
2.2.1 授权
2.2.1 跨域请求/CSWSH
检测
Upgrade: websocket
Connection: Upgrade
Cookie: session=KOsEJNuflw4Rxxxxxxxxxxxxxx
Sec-WebSocket-Accept: dBaGq6Oh1nXvQd+sJRKFK9GnsGI=
-
重放确认是否存在CSRF -
修改Origin头部,判断是否存在校验
对比CSRF
防御
-
检查客户端请求中的Origin信息是否跨域 -
防止Origin头部伪造,还可以借鉴CSRF的防御机制,如增加Token验证
2.2.2 拒绝服务攻击/DOS
-
客户端拒绝服务
-
服务端拒绝服务 -
发起大量连接
-
大数据帧占用
demo
-
js
wss = new WebSocketServer({ port: 3000 });
wss.on('connection', function (ws) {
console.log('[*]Client connected!');
ws.on('message', function (message) {
console.log(message.toString('utf8'));
});
});
-
正常客户端
<body>
<script>
var ws = new WebSocket("ws://127.0.0.1:3000");
// 连接打开事件
ws.onopen = function() {
// 发送数据给服务端
ws.send("Hello");
};
// 监听服务端信息
ws.onmessage = function(e){
alert(e.data);
};
</script>
Loaded!!
</body>
</html>
-
exp
class WS_Client(WebSocketClient):
# 需要重写以下三个方法
def opened(self):
reqData = "Hello"
self.send(reqData)
def closed(self, code, reason=None):
print("[-] Closed down:", code, reason)
def received_message(self, resp):
resp = json.loads(str(resp))
print(resp)
if __name__ == '__main__':
while True:
ws = WS_Client("ws://127.0.0.1:3000")
ws.connect()
2.2.3 中间人攻击
原文始发于微信公众号(山石网科安全技术研究院):Web协议层安全之websocket安全分析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论