web_cache

一、请求夹带

定义

就是说,http请求可以发送多个,但是服务器处理的时候,它必须要确认这一个一个的请求,前一个请求从哪里结束,下一个请求应该从哪里开始,这个就需要两端就请求边界,达到一致

所以攻击者在这些多个请求中,弄一个模糊边界的请求,就是导致两端对这个请求的边界界定不同

所以这里引入一个前提,必须是 前端服务器和后端服务器两个,而不是前后端一体

原理

HTTP /1规范,这里有两个不同的方式,指定请求结束位置标头

  1. Content-Length(CL),指明了消息正文长度

    比如,Content-Length:9 那消息正文,a=3456789

  2. Transfer-Encoding(TE),分块编码

    它将消息正文,根据n块区分

    分块编码是可以用于http请求的,只不过bp自动解包了,而一般在服务器响应才看得到

一般通过将这两个方式都加在一个单独http请求中,然后去发送,这个时候就考虑前端服务器和后端服务器的处理搭配情况

一般前端和后端的可能搭配:

CL,TE

TE,CL

TE,TE,但可以通过以某种方式混淆报头来诱导其中一个服务器不进行处理

计算方式:

Content-Length :

需要将请求主体中的 \r\n 所占的 2 字节计算在内,而块长度要忽略块内容末尾表示终止的 \r\n;

请求头与请求主体之间有一个空行,是规范要求的结构,并不计入 Content-Length

Transfer-Encoding: chunked

在每个块的开头需要用十六进制数指明当前块的长度,数值后接\r\n(占 2 字节),然后是块的内容,再接\r\n表示此块结束。最后用长度为 0的块表示终止块。终止块后跟两个回车换行

即:

1
2
0/r/n
/r/n

HTTP流水线原理,一个请求包中可以按序加入多个请求

Keep-Alive是默认特性,对相同目标服务器的请求,重用该TCP链接,这个就是为什么下面的实验传参两次可以触发

CL-TE

即前端CL优先,后端TE优先

目的,前端只能用GET和POST请求,但要让后端处理GPOST请求

构造如下请求,发送 2次,第二次结果如下:

前端处理了6字节的消息

到后端:

后端处理第一个快,是 0长度,则终止请求

后面的G,服务器作为下一个请求的开始

TE-CL

需要关闭,上方repeater模块的更新长度选项,发送两次,第二次响应如下:

后端用CL,只验证到5c\r\n,不解析了,下一次请求从GPOST开始,所以下一次拼接预留内容会报错

为什么要这样写呢?简单点不可以咩?

分析一下下面这个:

首先,

第一次发送:前端TE,读到0,传输完毕,后端CL,读取4,内容为

1
2
5\r\n
G

好,剩下的内容已知了,与第二次请求拼接,懂了,否则永远是G0POST,而不会是GPOST,所以要构造

1.所以当只构造GPOST / HTTP/1.1时,连发两次为什么是正常的捏????求告知

2.为什么构造的CL要15啊

1
2
3
4
5
6
7
你看啊Content-Type下面那个
Content-Type: 11 >=11都可以

x=1\r\n 5
0\r\n 3
\r\n 2
\r\n 0

PS:

发现那个最后一行,必须要的,空行也可以,有数据也可以

TE-TE

有必要让只有一个前端或后端服务器处理它,而另一个服务器忽略它,即转变成

TE-CL或CL-TE操作

前端TE读取到0了,认为是完整的,传给后端

后端由于那个TE识别不了,直接回退到CL处理,读取到12\r\n截止,后边的内容带到下次请求

我有点看不懂TE计算方式了,讨论计数

如图所示,我定义CL为3,而TE,第一块长度为4,内容12,后接换行,然后第二个终止块,提交两次的结果

前端第一块为4,那么计算方式为,前端读取第一块为4字节,12\r\n,后面的换行不计,遇到0,则传输完整,给后端

后端,TE处理错误,回退到CL,为3,那么4/r/n为3,不再解析,剩下内容留到下一次请求,所以得到120POST,单独的换行始终不计入

讨论计数

怎么计数方式老忘嘞,记录一下:

1.当CL<实际长度:服务端就解析部分请求参数

这里还是CL-TE为例

这里实际上CL是10,但这里就读6字节,下一次解析跟着后面的来

分析一下:前端读取6个消息长度,那就是下面这个样子

1
2
3
0\r\n  3
\r\n 2
4 1

第一次提交:前端认为传输完了,后端接手,第一块为0,即终结块,后端说没毛病,但是缓存了

1
4

2.第二次提交:你懂了,4和后面的新请求拼接了

当CL>实际长度:服务端等待,直到超时

所以当无法精确知道消息长度时,TF登场

TF-CL为例,这里实际的CL是103,各行CL长度如图,而TE长度,请参考CL的长度计算,只不过是十六进制表示了知道吧

总结

CL长度,永远记得,最后一行的\r\n的2字节不计数

每次前端是TE时,都要求构造一个全新的请求格式

猜测发现

根据时间延迟

证明存在

CL-TE

目的,去触发404

参考答案

很烦,我不理解;0后面除了跟两个回车换行,还可以加一些实体数据

下面这种任意格式吧,好像必须跟一个,很烦,当做固定格式吧

TE-CL

标准答案:

前端绕过

目的:绕过/admin权限,并删除用户carlos

CL-TE

都发送2次

1.尝试访问目标url,未授权

image-20231205160248586

2.尝试添加host,提示重复了

image-20231205160329573

3.构造更多的标头,进入,注意构造的CL,不能大的太离谱

image-20231205160434053

4.构造删除链接

触发重定向,删除成功

TE-CL

第一步,尝试访问,401

image-20231206123233999

第二步,加Host

第三步要改回GET

演示

来到登录窗口,随便输入一下账号密码抓包

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信