热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTTP/2H2C请求走私分析

 0x01 前言HTTP走私是bug bounty 项目中经常被关注的点。通过HTTP走私,攻击者可以访问内部的服务器甚至是获得各种提权的机会。当前HTTP/1.1被广泛应用,但也暴露出一些问题,比如

 

0x01 前言

HTTP走私是bug bounty 项目中经常被关注的点。通过HTTP走私,攻击者可以访问内部的服务器甚至是获得各种提权的机会。当前HTTP/1.1被广泛应用,但也暴露出一些问题,比如容易出现请求走私,使用HTTP/2可能是一个解决走私的一个方案。但HTTP/2就能完全防止走私吗?本文就对HTTP/2 h2c 走私进行一个简要的研究。

 

0x02 HTTP/2协议与H2C交换

通常HTTP/2协议在第一个HTTP请求之前,使用h2字符串进行标识,h2c是在Web协议从HTTP/1.1升级到HTTP/2的步骤中使用的标头。根据RFC-7540文档的描述,仅当客户端和服务器均支持HTTP/2时,才能使用HTTP / 2协议。如果有一个如下请求:

GET / HTTP/1.1
Host: test.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c

如果是不支持HTTP/2的服务器,则响应:

Server ignored

如果是支持HTTP/2的服务器,则响应:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c
[ HTTP/2 connection ...

通过阅读RFC-7540文档发现,HTTP/2通信与websocket通信有些类似。客户端(Web浏览器)询问服务器是否支持HTTP/2与Web服务器通信,并相应地决定使用HTTP/2还是HTTP/1.x通信。
HTTP/2通信是在第7层(应用程序)中执行的协议,使用TCP连接,由于它与现有的HTTP通信不同,101 Switching protocol会像websocket一样检查是否支持之后,才使用协议转换器。并且HTTP/2使用与HTTP/1.1相同的 “http “和 “https “URI方案,HTTP/2共享相同的默认端口号,比如在http->80,https->443上与HTTP相同。

An HTTP/2 connection is an application-layer protocol running on top of a TCP connection ([TCP]). The client is the TCP connection initiator.
HTTP/2 uses the same “http” and “https” URI schemes used by HTTP/1.1. HTTP/2 shares the same default port numbers: 80 for “http” URIs and 443 for “https” URIs. As a result, implementations processing requests for target resource URIs like “http://example.org/foo“ or “https://example.com/bar“ are required to first discover whether the upstream server (the immediate peer to which the client wishes to establish a connection) supports HTTP/2.
The means by which support for HTTP/2 is determined is different for “http” and “https” URIs. Discovery for “http” URIs is described in Section 3.2. Discovery for “https” URIs is described in Section 3.3.

当HTTP/1.x要升级到HTTP/2,标识符、HTTP2-Settings标头和Upgrade标头需要出现在http请求中。标识符的类型包括HTTP的h2c和HTTPS的h2。当Upgrade: h2c时,则以纯文本形式传递HTTP/2:

GET / HTTP/1.1
Host: test.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:

在服务器支持HTTP/2时,它将101 Switching protocol转发到客户端并建立TLS连接(HTTP/2)与客户端进行通信。在这种情况下,使用TLS-ALPN协议。在此过程中,使用APLN扩展名,客户端向服务器提供版本列表,然后服务器选择一个版本。同理,使用https时,HTTP/2选择h2

当直接使用HTTP/2时,通过TLS-ALPN进行协议协商之后,进行TLS连接。

 

0x03 H2C走私

许多Web服务都使用反向代理。在此过程中,当需要进行101 Switching时,代理服务器将充当中介,无需任何操作。通过阅读RFC文档和TLS中关于的HTTP/2配置文档,里面声明只有明文连接才可以使用h2c升级,并且转发时不应包含HTTP2-Settings头。

在RFC7540#section-3.2.1中指出:

HTTP2-Settings = token68
A server MUST NOT upgrade the connection to HTTP/2 if this header
field is not present or if more than one is present. A server MUST
NOT send this header field.

在http2-spec中还指出:

3.3 Starting HTTP/2 for “https” URIs
A client that makes a request to an “https” URI uses TLS [TLS12] with the application-layer protocol negotiation (ALPN) extension [TLS-ALPN].
HTTP/2 over TLS uses the “h2” protocol identifier. The “h2c” protocol identifier MUST NOT be sent by a client or selected by a server; the “h2c” protocol identifier describes a protocol that does not use TLS.
Once TLS negotiation is complete, both the client and the server MUST send a connection preface (Section 3.5).

在TLS上使用HTTP/2时,被告知使用h2协议标识符,而不是h2c。正如上一节提到的,h2c是一个用在http上的标识,而h2则是用于https的标识。如果代理通过TLS将h2c转发到后端进行协议升级,会出现什么情况呢?

我个人理解:在反向代理环境中,后端服务器仅知道客户端是Cleartext还是TLS(具有h2ch2等标识),因此它将TLS连接确定为HTTP,并在TLS连接上创建TCP隧道。在这种情况下,由于客户端不是HTTP,但仍可以通过TLS使用现有连接。换句话说,由于它是已连接的连接而不是HTTP通信,因此不受Proxy的ACL策略的影响,并且由于TCP Tunnel中的请求可以进行HTTP操作,因此可以访问被阻止的资源。个人感觉整个走私行为与WebSocket连接走私非常相似。

具体走私流程如下:
1 .客户端将HTTP/1.1升级请求发送到反向代理(发送了错误的标头)

2 .代理将请求转发到后端,后端返回101 Swiching协议的响应,并准备接收HTTP/2通信

3 .代理从后端服务器收到101响应时,将创建TCP隧道

4 .客户端从代理接收到101响应时,将重新用现有TCP连接并执行HTTP/2初始化

5 .客户端使用HTTP/2多路复用,发送针对受限资源的违法请求

6 .由于代理服不监视TCP通信(HTTP通过策略),因此它违法求发送到受限页面

7 .服务器响应,转发到TLS隧道,实现走私

0x04 如何检测

以下代理可能存在这一走私问题:

1 .默认支持(默认存在问题):

HAProxy v2.2.2

Traefik v2.2

Nuster v5.2

2 .需要配置(只有不恰当设置才会有问题):

AWS ALB / CLB

NGINX

Apache

Squid

Varnish

Kong

Envoy

Apache Traffic Server

那么如何进行检测测试呢?这里提供h2csmuggler工具

安装配置:

$ git clone https://github.com/BishopFox/h2csmuggler
$ cd h2csmuggler
$ pip3 install h2

扫描:

$ python3 h2csmuggler.py --scan-list urls.txt --threads 5

获取内部端点:

$ python3 h2csmuggler.py -x https://edgeserver -X POST -d '{"user":128457 "role": "admin"}' -H "Content-Type: application/json" -H "X-SYSTEM-USER: true" http://backend/api/internal/user/permissions

暴破端点:

$ python3 h2csmuggler.py -x https://edgeserver -i dirs.txt http://localhost/

这个过程中使用了HTTP/2的多路复用。复用是HTTP/2的主要功能,这意味着可以同时请求多个资源,可以理解为Connection: keep-alive , pipeline的改进版。

获取AWS 源数据 api:

$ python3 h2csmuggler.py -x https://edgeserver -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" http://169.254.169.254/latest/api/token`

更多使用细节参见:https://github.com/BishopFox/h2csmuggler

 

0x05 如何预防

对于HTTP请求走私/ WebSocket连接走私可能有多种应对对策,但从原则上讲,按照RFC文档中的说明,限制在TLS连接中使用h2c升级应该是最为有效的方法。当然,如果可能的话,也可以通过限制代理服务器中传递标头,仅处理由服务使用的标头来减小风险。

我个人认为,重要的是要防止使用未使用的标头,限制可以查看其他主机(例如host,x-forward-for等)的标头,以使私有路径无法被直接访问。与所有走私活动一样,防护方了解每一步消息传递的差异比依靠单纯补丁更有预防效果。对于这类通过请求走私或请求伪造攻击进行的任意用户控制的请求,应当维持纵深防御策略,减少架构中走私标头的重要性,在后端识别和拒绝可疑请求,才能有助于减小这类攻击的影响。

 

参考文献

https://github.com/BishopFox/h2csmuggler

https://www.hahwul.com/2019/10/30/websocket-connection-smuggling/

https://zh.wikipedia.org/wiki/HTTP/2

https://tools.ietf.org/html/rfc7540

https://tools.ietf.org/html/rfc7301

https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids

http://vlambda.com/wz_7iw9mXKwx3W.html


推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在 CentOS 7 环境中使用 MySQL 5.6 镜像启动数据库时遇到权限问题,本文将详细探讨并提供解决方案。 ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • MicrosoftDeploymentToolkit2010部署培训实验手册V1.0目录实验环境说明3实验环境虚拟机使用信息3注意:4实验手册正文说 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
author-avatar
Kevinczp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有