Web协议详解与抓包实战之WebSocket【二】

Web协议详解与抓包实战之WebSocket【二】

前言

《Web协议详解与抓包实战》课程学习,陶辉老师主讲

学习内容:

  1. HTTP–TLS/SSL–TCP/IP自上而下根据应用学习web协议WebSocket详细知识
  2. 结合抓包工具实践验证:chrome下的network面板、Tcpdump、Wireshark

Wireshark中的捕获过滤器:BPF过滤器

  • expression表达式:有多个原语组成
    • primitives 原语:有名称或数字,以及描述它的多个限定词组成
      • qualifiers限定词
        • Type:设置数字或者名称所指示类型,如 host www.baidu.com
          • host post
          • net 设置子网
          • portrange 端口范围
        • Dir:设置网络出入方向,如 dst port 80
          • src、dst、src or dst
          • 链路层限定词
        • Proto:指定协议类型,例如 udp
          • ip、ip6、udp、tcp等
        • 其他
          • gateway:指明网关IP地址
          • broadcast:广播报文
          • multicast:多播报文
          • less,greater:小于或者大于
    • 原语运算符
      • 与:&&或者 and
      • 或:||或者 or
      • 非:!或者 not
    • 例如:src or dst portrange 6000-8000 && tcp or ipv6
  • 还可以基于协议域过滤,根据相关协议的具体报文格式进行条件限定

Wireshark中的显示过滤器

  • 任何在报文细节面板中的解析出的字段名,都可以作为过滤属性

    • 视图-> 内部 -> 支持协议面板中,找到各字段名对应的属性名

      image-20201116174844248

  • 过滤值比较符号

    image-20201116175018618

  • 过滤值类型

    image-20201116175234768

  • 多个表达式之间的组合

    image-20201116175746703

  • 可视化操作界面,(显示过滤器的右边点击表达式即可打开)

    image-20201116175929834

WebSocket解决什么问题

背景:针对服务器的更新,客户端如何最快获取更新资源

在HTTP中,通常在客户端设置定时器轮询服务器是否更新,对网络带宽及服务器性能影响比较大,而WebSocket协议中服务器发生资源更新会立刻进行反向通知

image-20201123101547145

chrome network面板中分析WebSocket

image-20201123103306672

websocket测试工具:

image-20201124114924253

WebSocket约束

  • WebSocket的成本

image-20201124111608586

  • 长连接的心跳保持
    • HTTP长连接只能基于简单的超时
    • WebSocket连接基于ping/pong心跳机制维持
  • 兼容HTTP协议
    • 默认使用80/443端口
    • 协议升级
    • 代理服务器可以简单支持

设计哲学:在Web约束下暴露TCP给上层

image-20201124114650871

WebSocket协议格式

  • WebSocket帧格式示意图

    image-20201124115306159

  • 数据帧格式

    • RSV保留值

      image-20201124115345674

    • 帧类型

      image-20201124115542331

  • ABNF描述的帧格式

    image-20201124152936099

如何从HTTP升级到WebSocket

  • URI格式

    image-20201124153303388

建立握手

wireshark抓到的握手包

GET /?encoding=text HTTP/1.1
Host: echo.websocket.org
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Upgrade: websocket
Origin: http://www.websocket.org
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _ga=GA1.2.693702036.1606204934; _gid=GA1.2.1767752127.1606204934; _gat=1
Sec-WebSocket-Key: 3LL/srKFKhCwEf6CWCsZtw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

HTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://www.websocket.org
Connection: Upgrade
Date: Tue, 24 Nov 2020 07:42:16 GMT
Sec-WebSocket-Accept: 12qI6yp0o4W1p8gnaMpdQJ6+qwo=
Server: Kaazing Gateway
Upgrade: websocket

image-20201124153343704

  • 红色字体表示基础必选字段
    • 请求头字段Connection和Upgrade,相当于告诉服务端要申请切换到WebSocket协议
      • Connection头字段指定Upgrade、申请切换协议
      • Upgrade头字段指定为websocket、具体告诉服务端想切换的协议为WebSocket
  • 蓝色表示跨域资源消息
  • 涉及的头字段解释:
HTTP头 是否必须 解释
Host 服务端主机名
Upgrade 固定值,”websocket”
Connection 固定值,”Upgrade”
Sec-WebSocket-Key 客户端临时生成的16字节随机值, base64编码
Sec-WebSocket-Version WebSocket协议版本
Origin 可选, 发起连接请求的源
Sec-WebSocket-Accept 是(服务端) 服务端识别连接生成的随机值
Sec-WebSocket-Protocol 可选,客户端支持的协议
Sec-WebSocket-Extensions 可选, 扩展字段

image-20201124154717351

传递消息时的编码格式

消息与数据帧

image-20201124155304413

非控制帧的消息分片:有序

image-20201124155548292

使用wireshark抓包查看

image-20201124160923646

数据帧格式:消息内容的长度

消息内容不同的长度对应图中帧中不同的颜色区域

image-20201124161116844

发送消息

image-20201124161451581

掩码及其所针对的代理污染攻击

为什么进行掩码处理:减少缓存污染攻击

image-20201124165512575

frame-masking-key掩码

image-20201124165552495

掩码的目的:防止恶意页面上的代码,可以经由浏览器构造出合法的GET请求,使得代理服务器可以识别出请求并缓存响应

image-20201124165815526

wireshark抓包验证:

image-20201124170433297

如何保持会话心跳

心跳帧

image-20201124162833798

wireshark心跳包查看

ping

image-20201124162956080

pong

image-20201124163013838

如何关闭会话

  • 控制帧中的关闭帧:在TCP连接之上的双向关闭

    • 发送关闭帧后,不在发送任何数据
    • 接收到关闭帧后,不在接收任何到达的数据
  • 关闭帧的格式

    image-20201124163313366

    image-20201124164259606

  • 关闭帧的错误码

    image-20201124164222830

猜你喜欢

转载自blog.csdn.net/weixin_39664643/article/details/110087509