【技术解读】【WebSec】Abusing HTTP hop-by-hop request headers

news/2025/2/22 23:30:24/文章来源:https://www.cnblogs.com/wh03ver/p/18112413

Abusing HTTP hop-by-hop request headers 这个技术在 2019年入选了 Portswigger 安全社区评选的 top 10 Web hacking techiniques of 2019 的候选名单,尽管最终没有入选 top 10,但个人觉得还是挺有意思的,后来也出现了与之相关的真实世界的漏洞案例,因此值得学习。

什么是hop-by-hop Headers

根据 RFC 2616#13.5.1章节的描述,在 HTTP/1.1 中,以下header都是 hop-by-hop 头:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailers
  • Transfer-Encoding
  • Upgrade

hop-by-hop header 简单理解就是会被代理服务器消费掉(或者说是移除掉),不会最终转发到后端服务器去的请求头。
而与之对应的就是 end-to-end header,end-to-end header 就是会一直转发到后端服务器去的请求头,除 hop-by-hop header外的请求头都是 end-to-end header。

根据 RFC 2616#14.10章节的描述,如果想添加其他的非标准的hop-by-hop header为 hop-by-hop header,可将 该请求头添加到 Connection请求头中,如 Connection: close,X-Auth-Token, X-Forwarded-For

Abusing hop-by-hop Headers的攻击原理

借用原文的图:
第一个正常的请求中,第一个代理服务器Proxy 1,会添加一个请求头X-Important-Header,最终该请求头会到后端服务器中;
而在第二个请求中,加入了hop-by-hop header(将 X-Important-Header添加到Connection头中),到了第一个代理服务器Proxy 1,Proxy 1往请求中添加 X-Important-Header请求头,然后再转发到第二个代理服务器 Proxy 2,Proxy 2看到 X-Important-Header 是一个hop-by-hop header,则会将请求中的 X-Important-Header请求头移除,最后再把请求转发到后端服务器。

应用场景

适合用于尝试攻击那种基于 IP 作为访问控制的,且具有多级反向代理(nginx/alb/apache等)的Web服务.

1、比如隐藏源IP地址,在多级反向代理的链路中,一般第一级代理Proxy 1会将用户的访问IP添加到 X-Forwarded-For头(也可能是X-Real-IP或别的什么)中,然后再往下一级代理转发,最后转发到后端服务器。如果用户在原始请求中将 X-Forwarded-For 头设置为hop-by-hop头,那么在第二级代理 Proxy 2接收到请求时,发现X-Forwarded-For 为hop-by-hop 头,则移除掉,然后继续往后转发。因此用户的访问IP就不会被后端服务知道了。

2、绕过基于IP的访问控制机制。作者给的一个关于 CloudFoundry gorouter的例子。假设后端服务器会根据访问IP是否来自内部(比如 10.1.2.0/24),来决定可以访问 /admin。首先用户在原始请求中将X-Forwarded-For 作为hop-by-hop头,然后请求到达 Proxy 1,Proxy 1将用户访问IP添加到X-Forwarded-For,然后将请求转发到Proxy 2,Proxy 2发现X-Forwarded-For为hop-by-hop头,则移除X-Forwarded-For,然后转发到gorouter,gorouter看到X-Forwarded-For头缺失,则会添加X-Forwarded-For 且设置为 上一级代理服务器的IP(假设为 10.1.2.3),从而导致最终访问到了 /admin.

3、结合缓存投毒实现DoS。这个作者并没有现实世界的案例,只是搭了个环境作了演示。其实很简单,就是利用hop-by-hop,使某些请求头在代理链过程中被移除了,导致接口访问异常,同时接口访问可以命中缓存,所以导致别人访问该接口也会异常,实现了DoS.

由于hop-by-hop 是利用的header,所以实际利用的时候可以通过 https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/BurpSuite-ParamMiner/lowercase-headers 这些header进行暴破.

5、另外一些比如服务指纹识别、SSRF、WAF绕过,作者在文章中也有提到,虽然不是很详细,也没有实际例子作支撑。但是给人启发,足矣。


另外提几个实际的漏洞案例:

1、Go ReverseProxy CVE-2021-33197

假设web服务的代理链如下:

基于前面的场景,再添加一个proxy,如:client -> proxy 1 -> proxy 2 -> proxy 3 -> backend,则hop-by-hop headers及 Connection 在到达 proxy 2 处理后就不会转发给proxy3,对于 proxy3 接收到的请求并不存在 hop-by-hop。

该漏洞在于,可以传入两个Connection,从而让 Connection转发到下一个proxy,让hop-by-hop在下一个proxy中生效。
问题代码在:https://github.com/golang/go/blob/2ebe77a2fda1ee9ff6fd9a3e08933ad1ebaea039/src/net/http/httputil/reverseproxy.go#L250-L265
image

获取到第一个 Connection:头为空时,直接 continue。

因此在该漏洞中,如果 client -> proxy 1 -> Go ReverseProxy -> proxy 3 -> backend,
client发起如下请求:

GET /api/test
Connection:
Connection: X-Real-IP

proxy 1添加 X-Real-IP,并添加用户的访问IP,再转发到 Go ReverseProxy,如下:

GET /api/test
X-Real-IP:10.0.0.1
Connection:
Connection: X-Real-IP

Go ReverseProxy获取到一个 Connection 为空,直接continue,然后转发到 proxy 3,proxy 3移除 hop-by-hop,到backend的请求如下:

GET /api/test

Reference

https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers
https://datatracker.ietf.org/doc/html/rfc2616#section-13.5.1
https://tools.ietf.org/html/rfc2616#section-14.10
https://github.com/golang/go/issues/46313
https://articles.zsxq.com/id_rfsu4pm43qno.html
https://twitter.com/jinonehk/status/1420413477521301507
https://twitter.com/albinowax/status/1523667032646242306

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887797.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞分析】CVE-2024-22243: Spring Framework URL Parsing with Host Validation

漏洞公告漏洞分析 从公告中可知该漏洞关键点在 UriComponentsBuilder 这个类。通过以前的Springboot工程全局搜索可知该类在于spring-web 这个jar包里。于是我们可以diff 下 spring-web 的 5.3.31 和 5.3.32 这两个版本的jar。可以看到,UriComponentsBuilder 类的改动只涉及…

【漏洞分析】CVE-2024-22259: Spring Framework URL Parsing with Host Validation (2nd report)

漏洞公告漏洞分析 这个漏洞本质上跟之前的CVE-2024-22243是同一个问题,且之前官方修复的不完全,导致还是可以被绕过。 这一点,官方在公告里也提到了。 补丁diff下,能看到其实还是url解析的那个正则表达式的修改: //5.3.31的正则: ^(([^:/?#]+):)?(//(([^@/?#]*)@)?(\…

用AOT导出本地dll

记得之前在做医保接口时,经常要调一些C++或delphi写的本地dll(这些dll通常是用来读医保卡之类),这里简单介绍一下用C#生成本地可以直接调用dll,具体做法是通过UnmanagedCallersOnlyAttribute来完成。dll项目文件如下<Project Sdk="Microsoft.NET.Sdk"><…

AOT反射库-AOTReflection

在AOT项目中,使用反射有一些问题,本程序包利用源生成器,按不同的维度,提前获取对应类型的元数据,从而达到平滑使用Reflection部分功能。项目:https://github.com/axzxs2001/AOTReflectionnuget:https://www.nuget.org/packages?q=AOTReflection如下面代码,利用泛型的反…

快乐地在AOT项目中用反射

反射是.NET开发的利器,但对于AOT来说,因为Native编译,所以反射的功能基本在AOT编译的项目中失效。办法总比困难多,这么好的东西不能扔掉,下面是“尽量”可以使用反射的例子,为什么“尽量”,看完下面的案例我们再做说明。在AOT项目中使用反射基本原理:利用源生成器,在b…

10亿数据,如何做迁移?

前言 某次金融系统迁移项目中,原计划8小时完成的用户数据同步迟迟未能完成。 24小时后监控警报显示:由于全表扫描SELECT * FROM users导致源库CPU几乎熔毁,业务系统被迫停机8小时。 这让我深刻领悟到——10亿条数据不能用蛮力搬运,得用巧劲儿递接! 今天这篇文章,跟大家一…

2025.2.21的模拟赛题“糖果”题解

2025.2.21的模拟赛题“糖果”题解为避免混淆,题目中的 \(X\) 在下文中为大写。 称前 \(k-1\) 次操作成为1号操作,第 \(k\) 次(不含)以后的操作称作2号操作 设 \(f_{x,i,j}\) 表示在 \(x\) 的子树中,1号操作做了 \(i\) 次,2号操作做了 \(j\) 次 限制就是\(X\) 到跟的路径不…

【飞书】Zabbix 7.2 告警与飞书机器人深度联动的全流程

midnight, the sound of a phone buzzing wakes you up abruptly. "又是告警!"你猛地从床上坐起,眼睛酸涩地盯着手机屏幕。作为一名运维工程师,这样的场景几乎成了家常便饭。无论是深夜还是清晨,系统故障总能找到你的联系方式,仿佛在提醒你:科技24小时不眠不休…

Windows平台上Idea、Tomcat、浏览器页面显示乱码问题解决

核心:乱码问题是由于字符编码不一致导致的,所以解决乱码问题的核心概念是统一字符编码。首先我们查看各个平台的字符编码: Windows cmd中输入chcp 命令查看(Windows系统默认字符编码时GBK)936 代表 GBK 65001 代表 UTF-8 注意:通过chcp命令如 chcp 65001 来更改字符编码只…

关于 xrlong 是神的论证

xrlong orz搜索内容搜索结果__________________________________________________________________________________________本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18729881

idea插件+cursor使用技巧

cursorignore配置# Compiled files *.class *.jar *.war# Build directories target/ build/# IDE files .idea/ *.iml .vscode/ .project .classpath .settings/# Logs *.log logs/# Temporary files *.tmp *.bak *.swp# Maven specific .mvn/ mvnw mvnw.cmd# Spring Boot spe…

设计测试用例方法 -经验方法(三种)

1、基于经验的测试技术之错误推测法 错误推测法也叫错误猜测法,就是根据经验猜想,已有的缺陷,测试经验和失败数据等可能有什么问题并依此设计测试用例2、基于经验的测试技术之异常分析法 系统异常分析法就是针对系统有可能存在的异常操作、软硬件缺陷引起的故障进行分析,依…