HTTP请求走私

一.前提

需要有两台服务器,一台cdn缓存服务器,一台真实服务器,cdn和服务器之间相当于代理关系。

二.原理

利用HTTP请求的请求体的两种判断:
1.利用Content-Length字段来判断请求体的内容长度
2.利用Transfer-Encoding字段来判定请求体的结束位置
不同的服务器分割请求的标准不一样。对同一段tcp内容,前后端服务器获取到的http请求个数不一致,就导致了请求走私
这里简单介绍一下CL和TE的作用:
CL:请求体的长度就是CL的值
TE:分块传输的标志,以0\r\n\r\n代表分块结束(也就是0换行两次)

三.分析

CL-TE

靶场地址:https://portswigger.net/web-security/request-smuggling/lab-basic-cl-te
1.进入靶场抓包并放到repeater中
在这里插入图片描述
2.将此选项关闭,为了不影响后续CL的值
在这里插入图片描述
截图已经关闭
3.将包改为POST请求
在这里插入图片描述
在这里插入图片描述
4.接下来我们就可以构造恶意数据了
修改Content-Length的值并且增加TE,修改如下图:
在这里插入图片描述
上图是我们修改后已经发送的一次请求
接下来发送第二次请求,
在这里插入图片描述
可以看到结果正是我们想要的结果。
分析:因为是CL-TE的请求方式,因此前端为CL,后端服务器为TE,CL长度设定为7,长度计算是这样的:从第一个字母开始算第一个,每次换行时都会有一个\r\n,那么这就是两个字节,那么我们的7是这样的形式:0\r\n\r\nhd,那么前端以CL请求头时,数据包是除了最后一个h没有前面的都有的,但是后端是TE请求头,它会按照0\r\n\r\n为结尾,那么,他将hd截掉了,在本次请求包中没有,那么当再次发送请求时,将会出现在第二次请求的开头。
照上面的思路走,我们将CL改为8出现的结果将会是HDHPOST,那么继续试验:
第一次请求:
在这里插入图片描述
第二次请求:
在这里插入图片描述
跟预料的结果一样

TE-CL

靶场地址:https://portswigger.net/web-security/request-smuggling/lab-basic-te-cl
1.还是将数据包放入repeater,并转为post,如下图
在这里插入图片描述
2.构造恶意数据
修改Content-Length的值并且构造出第二次我们的请求包,修改如下图:
在这里插入图片描述
上图是我们修改后已经发送的一次请求
接下来发送第二次请求,
在这里插入图片描述
出现了我们想要的结果
分析:因为是TE-CL的请求方式,因此前端为TE,后端服务器为CL,前端根据TE会取到0,那么数据包中有所有的POST请求,但到达后端后,后端采用CL,那么只会取4字节:5c\r\n,那么第一次请求将会截掉GPOST之后的,第二次请求时将会出现在开头。

TE-TE

靶场地址:https://portswigger.net/web-security/request-smuggling/lab-obfuscating-te-header
1.还是将数据包放入repeater,并转为post,如下图
在这里插入图片描述
2.构造恶意数据
在这里插入图片描述
上图是我们修改后已经发送的一次请求
接下来发送第二次请求,
在这里插入图片描述
分析:前端和后端服务器都采用TE,可以通过混淆TE头的方式来使得其中一个服务器不使用TE头的处理方式。转而进行CL解析,演变成CL.TE或TE.CL漏洞的形式。
常用混淆格式:
在这里插入图片描述

CL-CL

根据RFC7230的规范中,服务器接收两个Content-Length且两者值不同时,需要返回400错误,如果服务器不遵守规范,前端服务器读取第一个CL,而后端服务器读取了第二个CL,便造成了走私

POST / HTTP/1.1
Host:xxx.com
Content-Length:5
Content-Length:4
hello

余下的’o’被当成正常请求拼接到下一个请求中

CL!=0

CL不为0,当前端服务器允许GET请求携带请求体,而后端请求体不允许携带请求体,后端会忽略掉GET请求中的Content-Length头,可能会导致请求走私。

GET /HTTP/1.1
Host:xxx.com
Content-Length:33
GET /HTTP/1.1
Host:xxx.com

由于Pipeline存在,后端服务器忽略了CL后,可能会认为受到了两个数据包。

四.漏洞检测技术

1.延时技术—CL.TE漏洞

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 4
 
1
A
X

当前端服务器使用头且规定了CL的长度时,它仅仅会转发请求中的部分内容,X除外。而后端服务器使用Transfer-Encoding分块传输方式,它会接受到第一个分块数据 1\r\nA,但未遇到结束符0,继续等待直至响应超时

2.延时技术—TE.CL漏洞

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 6
 
0
 
X

当前端服务器使用Transfer-Encoding头,在处理第一个分块的时候就遇到了0,结束解析,将数据包发送到后端服务器,X除外。而后端服务器使用Content-Length的方式,它会继续等待6个字节长度的数据直至响应超时。

3.CL.TE漏洞—响应包差异

在这里插入图片描述
第一次发包如上图,接下来进行第二次发包
在这里插入图片描述
发现成功发生请求夹带

4.TE.CL漏洞—响应包差异

在这里插入图片描述
第一次发包如上图,接下来进行第二次发包
在这里插入图片描述
发现也成功发生请求夹带

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值