HTTP是一种超文本传输协议,

2024-05-2302:09:25综合资讯0

这是关于网络指纹识别的两部分系列的第二部分。

与 TLS 指纹类似,HTTP/2 也是一种 Web 服务器可以依赖于其来识别客户端的方法。

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

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

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

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

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

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

image

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

如何查看服务端是否使用的是 HTTP/2 协议呢?

在 Chrome 上查看如下所示:

image

在 Firefox 上查看如下所示:

  • 多路复用(Multiplexing)——多个请求和响应可以同时共享同一个 TCP 连接,从而减少了获取具有大量资源(图像、脚本等)的站点的时间。
  • 优先级(PRIORITY)——HTTP/2 支持对某些请求和响应进行优先级排序。
  • 服务器推送(Server push)——在 HTTP/2 中,服务器可以在客户端请求资源之前将资源发送给客户端。

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

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

每个流都带有编号,从 0 开始

如上图:编号为 0 的流包含如下内容:

  • SETTINGS 是客户端发送的第一帧,包含 HTTP/2 的特定配置
  • WINDOW_UPDATE:增加接收器的窗口大小,下文详细介绍

然后,编号开始递增,代表了客户端给服务端发送的实际请求。如上图所示,编号为 1 的流包含:

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

这里推荐使用 nghttpd,它可以很方便地创建一个 HTTP/2 协议的 web 服务器。最关键的是,在客户端请求时,它能够直观地将每一帧打印出来(如下展示)。我将它安装在 WSL 的 Ubuntu 机器上,还必须自建一个证书。这里我遇到了一些坑,有关避坑指南,请参见我写的文章(wsl 创建证书让 Chrome 浏览器识别):</span

客户端发送第一帧时,其中包含一些特殊设置。

  • Chrome
  • Firefox
  • CURL
  • Python

客户端配置不同类型的设置,并且值也不同。这区分了浏览器。这个配置不易于控制,因此可用于指纹识别

HTTP/2实现了流量控制机制,使接收端能够调节每个流的流量,使用 WINDOW_UPDATE 实现

默认窗口大小由SETTINGS Frame帧的 SETTINGS_INITIAL_WINDOW_SIZE 控制。例如,Chrome使用了6MB而Firefox使用了128KB

客户端接收数据时,可以使用 WINDOW_UPDATE 帧增加窗口大小

Chrome连接级窗口大小增加到15MB

Firefox增加到12MB

curl 使用 32MB

参考:https://github.com/curl/curl/blob/10cd69623a544c83bae6d90acdf141981ae53174/lib/http2.cL62

PYTHON增加到16MB

也可以使用此参数进行指纹识别

看起来很好

一般来说,HEADERS 包含了 HTTP/1.1 的所有功能,包括 URI、方法(GET/POST/等)和客户端的头等

下面是伪标题:顺序对每个客户端是不同的

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

进行测试

image

顺序是:a,m,s,p

image

顺序是:p,m,a,s

image

顺序是:s,m,p,a

image

顺序是:a,m,s,p

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

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

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

image

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

https://github.com/yuzd/ja3-csharp

image

在线测试(保护了tls指纹和用于h2指纹的关键参数):

https://kawayiyi.com/tls

知道了原理,还不好过吗

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

比如这篇论文:

https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf

详细介绍了一项具有类似结论的研究

作者:俞正东

来源:微信公众号:halouha

出处:https://mp.weixin.qq.com/s/JgrrrCmX5Pz04pegGRrhFw