HTTP/2 指纹识别

和Tls指纹类似也是一种 Web 服务器可以依赖指纹来识别哪个客户端。

例如,它可以识别浏览器类型和版本,或者是否使用了脚本(你是真实浏览器啊还是ScriptBoy?)。

该方法依赖于 HTTP/2 协议的内部结构,与其更简单的前身 HTTP/1.1 相比,这些内部结构鲜为人知。

在这篇文章中,我将首先简要介绍 HTTP/2协议,然后详细介绍我们可以协议的哪些参数来识别你究竟谁(what are you)!

与HTTP/1.1相比

使用HTTP/1.1协议,客户端向服务器发送文本请求(通常使用 TLS 加密)默认情况下,Chrome 的请求如下所示:


GET / HTTP/1.1
Host: www.wikipedia.orgsec-ch-ua: " Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

User-Agent包含客户端的确切版本,虽然可用于识别客户端。但是很容易被任何 http 库或命令行工具伪造(地球人都知道)!

HTTP/2 简介

HTTP/2 是 HTTP 协议的主要修订版,从 2015 年左右开始出现。现在大约一半的网站使用 HTTP/2

基本上所有流行的网站都默认使用它!

如何看服务端使用的是否是http2协议呢?

在chrome上看是这样的

在Firefox上看是这样的

HTTP/2 的主要目标是提高性能

  • 多路复用(Multiplexing ) - 多个请求和响应可以同时共享同一个 TCP 连接,从而减少了获取具有大量资源(图像、脚本等)的站点的时间。
  • 优先级(PRIORITY) - HTTP/2 支持对某些请求和响应进行优先级排序。
  • 服务器推送(Server push) - 在 HTTP/2 中,服务器可以在客户端请求资源之前将资源发送给客户端。
  • 插播一条广告:需要开通正版JetBrains全家桶的可以联系我,56元一年,正版授权,官网可查有效期,有需要的加我微信:poxiaozhiai6,备注:902。

然而,HTTP 协议的应用程序语义没有改变:它仍然由熟悉的请求/响应模型组成,包括 URI、HTTP 方法、HTTP 标头和状态码。

Frames and Streams

HTTP/2 是一种二进制协议,与文本 HTTP/1.1 不同。HTTP/2 中的消息由帧组成,有十种不同用途的帧。帧始终是流的一部分。

Stream都是有编号的,从0开始

如上图:编号为0的Stream包含如下

  • SETTINGS是客户端发送的第一帧,包含 HTTP/2 的特定配置,
  • WINDOW_UPDATE- 增加接收器的窗口大小,下面会讲到

然后是编号开始递增,代表了客户端给服务端发送的实际请求,如上图为1的Stream:

  • HEADERS 包含 URI、HTTP 方法和客户端的 HTTP 头
  • DATA 包含来请求的资源数据以及服务器的响应

使用 HTTP/2 进行客户端指纹识别

研究http2协议的工具

这里推荐使用nghttpd,它可以很方便的创建一个http2协议的webserver。
最关键的是,让客户端请求的时候它能够直观的把每一帧都给打印出来(下面会给大家演示)
我将它安装在wsl的ubuntu机器上,还得自建一个证书,这里我遇到了一点坑。

下面就是如何使用nghttpd跑h2协议server

我这里分别使用如下客户端来测试

  • Chrome浏览器
  • Firefox浏览器
  • CURL
  • Python脚本

1. SETTINGS

上面介绍到这是客户端发送的第一帧,里面有一些特殊配置

Chrome

recv SETTINGS frame <length=24, flags=0x00, stream_id=0>[SETTINGS_HEADER_TABLE_SIZE(0x01):65536][SETTINGS_MAX_CONCURRENT_STREAMS(0x03):1000][SETTINGS_INITIAL_WINDOW_SIZE(0x04):6291456][SETTINGS_MAX_HEADER_LIST_SIZE(0x06):262144]

Firefox

recv SETTINGS frame <length=18, flags=0x00, stream_id=0>[SETTINGS_HEADER_TABLE_SIZE(0x01):65536][SETTINGS_INITIAL_WINDOW_SIZE(0x04):131072][SETTINGS_MAX_FRAME_SIZE(0x05):16384]

CURL

recv SETTINGS frame <length=18, flags=0x00, stream_id=0>[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100][SETTINGS_INITIAL_WINDOW_SIZE(0x04):1073741824][SETTINGS_ENABLE_PUSH(0x02):0]

PYTHON

recv SETTINGS frame <length=36, flags=0x00, stream_id=0>[SETTINGS_HEADER_TABLE_SIZE(0x01):4096][SETTINGS_ENABLE_PUSH(0x02):0][SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535][SETTINGS_MAX_FRAME_SIZE(0x05):16384][SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100][SETTINGS_MAX_HEADER_LIST_SIZE(0x06):65536]

很明显,根据测试,在SETTINGS Frame帧里面配置,
不同的客户端设置的种类和值都是不同的,这使得很容易区分是否是浏览器,
而且这个配置不容易控制,可以用于指纹识别!

WINDOW_UPDATE

HTTP/2 实现了一种流控制机制。
流量控制为接收方提供了在每个流的基础上调节流量的机制。
使用WINDOW_UPDATE大小来实现的

默认窗口大小由SETTINGS帧里面的 SETTINGS_INITIAL_WINDOW_SIZE中的值控制,
参考上方测试,可以看到 Chrome 使用 6MB (6291456) 而 Firefox 使用 128KB (131072)

当客户端接收数据时,它可以使用WINDOW_UPDATE框架来调整窗口大小,从而增加其窗口大小。

Chrome

recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>(window_size_increment=15663105)

Chrome 实际上将连接级窗口大小增加到 15MB (15663105+65535=15MB)

Firefox

recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>(window_size_increment=12517377)

Firefox 会将其增加到 12MB

CURL

recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>(window_size_increment=1073676289)

curl使用 32MB

PYTHON

recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>(window_size_increment=16777216)

PYTHON 会将其增加到 16MB

所以我们也可以使用该参数用于指纹识别!

HEADERS

这个有点意思了

从广义上讲,HEADERS 包含了 HTTP/1.1 的所有功能,包含了
URI、方法(GET/POST/等)和客户端的头等!

下面的几个伪标头的顺序对于每个客户端是不同的。

  • :method
  • :authority
  • :scheme
  • :path

我们来测试一下

Chrome

顺序是:
m,a,s,p

Firefox

顺序是:
m,p,a,s

CURL

顺序是:
m,p,s,a

Python

顺序是:
m,a,s,p

这个看似很小的差异,也可以用于指纹识别

HTTP/2 指纹识别在哪里使用?

它用于与TLS 指纹识别类似的目的:比如反 DDOS 和反脚本等自动爬虫(提高门槛),只允许真实浏览器等。

如何让你的server具有提取客户端HTTP2指纹的能力

ja3是tls指纹的标准,wiresharp也默认带有

搞http2指纹的目前市面上还没有标准,
我开源了一款提取tls&http2指纹的中间件(面向aspnetcore的)

在线测试:

https://kawayiyi.com/tls


{"tlsVersion": "Tls12","tcpConnectionId": "0HMKCUARI97OU","tlsHashOrigin": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0","tlsHashMd5": "cd08e31494f9531f560d64c695473da9","cipherList": ["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA","TLS_RSA_WITH_AES_128_GCM_SHA256","TLS_RSA_WITH_AES_256_GCM_SHA384","TLS_RSA_WITH_AES_128_CBC_SHA","TLS_RSA_WITH_AES_256_CBC_SHA"],"extentions": ["server_name","extended_master_secret","renegotiation_info","supported_groups","ec_point_formats","session_ticket","application_layer_protocol_negotiation","status_request","signature_algorithms","signed_certificate_timestamp","key_share","psk_key_exchange_modes","supported_versions","compress_certificate","extensionApplicationSettings","padding"],"supportedgroups": ["X25519","CurveP256","CurveP384"],"ecPointFormats": ["uncompressed"],"proto": "HTTP/2","h2": {"SETTINGS": {"1": "65536","3": "1000","4": "6291456","6": "262144"},"WINDOW_UPDATE": "15663105"}
}

如何过http2指纹呢?

知道了原理,还不好过吗

总结

指纹识别在整个网络中变得非常普遍,Http2的指纹相对来说不为人知,但是并不新鲜。

HTTP2指纹识别(一种相对不为人知的网络指纹识别方法)相关推荐

  1. 计算机家庭网络未识别,Win7排除常见家庭网络问题的方法

    在使用电脑的过程中,我们常常会遇到一些问题,最常见的要数网络问题了.遇到网络问题我们首先是要进行排查,可是很多用户不知道怎么排除常见家庭网络问题,其实方法很简单,如果你不知道的话,那就赶紧看看那小编整 ...

  2. matlab 指纹,一种基于matlab的指纹识别方法

    一种基于matlab的指纹识别方法 [技术领域] [0001 ] 本发明涉及指纹识别领域,特别涉及一种基于MTLAB的指纹识别方法. [背景技术] [0002] 传统的安防系统主要采用基于令牌或密码的 ...

  3. python人脸识别门禁_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(一)

    一.设计目标:旨在PC端上搭建一款具有指纹识别与人脸识别功能的门禁兼考勤系统.该系统同时具备普通用户模式.管理员模式与超级管理员模式,下面具体介绍每种模式下的功能. 1)普通用户模式 该模式可分为收集 ...

  4. 一种基于嵌入式的多重识别门禁系统设计方案

    一种基于嵌入式的多重识别门禁系统设计方案 1. 前言 门禁系统已广泛的应用在各行各业,随着社会经济的发展,人们对门禁系统的要求越来越高,设计更加安全.更加方便的门禁系统势在必行.由于不同企业对于门禁系 ...

  5. 磁共振指纹:一种新颖的定量磁共振技术

    前言 磁共振指纹(MRF,MR fingerprinting)是一种新颖的定量磁共振技术,可以在较短的扫描时间内同时量化多种组织特性.自2013年首次发表在<Nature>杂志上以来,该技 ...

  6. 【指纹识别】基于模板匹配实现指纹识别门禁系统含Matlab源码

    1 简介 近年来,随着识别技术和网络技术的飞速发展,门禁系统也得到了飞跃式的发展,出现了基于指纹识别的门禁系统.这种系统具有安全性,方便性和易管理性等特点,是确保各重要部门出入口安全的有效措施,现已广 ...

  7. 前端与后端,顶象设备指纹的两种接入方式

    在如今的移动互联网时代,用户上网的设备多元化.连接互联网的渠道多样化.接入服务的地点任意化,用户的操作行为个性化,用户设备更加难以被识别和跟踪,由此给广大开展数字化业务的企业,尤其互联网企业带来全新的 ...

  8. AAAI 2020 | 华南理工:面向文本识别的去耦注意力网络

    2020-01-15 06:12:12 作者 | 王天玮 编辑 | 十.年 本文对华南理工大学和联想研究院共同完成,被AAAI-20录用的论文<Decoupled Attention Netwo ...

  9. 基于ANN的6种调制信号自动调制识别(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)

    目的: 实现6种(2ASK.4ASK.2FSK.4FSK.2PSK.4PSK)调制信号自动调制识别. 条件:windows 10,MATLAB 2014a 内容: 本实验设计了一个分层结构的MLP神经 ...

最新文章

  1. C++ :: 的用法小结
  2. mac上投屏android_全平台Win/Mac全设备Android/iOS 免费无线投屏神器
  3. 前端开发工程师——网易云课堂
  4. go WaitGroup的使用
  5. (转)Android属性设置android:noHistory=true
  6. 关于我使用的angular.js的上传---FileUploader
  7. linux sudo使用和sudoers配置详解
  8. nginx工作笔记005---nginx配置负载均衡_在微服务中实现网关集群_实现TCP传输层协议__http协议的负载均衡
  9. python文件系统监控_简单了解Python下用于监视文件系统的pyinotify包
  10. word中导出高分辨率pdf
  11. 上古计算机语言,微软开源其上古编程语言GW-BASIC
  12. 使用moviepy为视频添加字幕
  13. Veeam Backup Replication 8 迁移与实例恢复
  14. 45.【Java 实现双色球中奖查询系统】
  15. unable to find valid certification path to requested target的异常解决办法
  16. 分享2020年线上支付接口产品讲解
  17. Git stash 的用法,将暂存区的内容缓存并移除,解决切换分支前的内容缓存问题
  18. 互联网校招其他专题书籍复习方法详解
  19. excel底层数据结构原来是这样的
  20. 数字图像处理与Python实现

热门文章

  1. 学院后勤报修系统php,学校后勤报修系统功能介绍
  2. python 电动车问题
  3. Bug的严重程度(缺陷程度)有哪几种。。。。
  4. 科达视频系统设置服务器,科达电力系统视频监控解决方案
  5. Python webdriver.Chrome()的使用
  6. C11简洁之道:tupe元祖
  7. Python中list、tupe、dic、set的使用小记
  8. 关于SWOT,你了解多少?
  9. 计算机程序UI设计员SWOT分析,计算机专业学生个人SWOT分析案例.doc
  10. 掷骰子游戏-C语言实现