点击蓝字,关注我们
日期:2023-07-28 作者:hdsec 介绍:本文介绍一下HTTP分块传输在渗透中的应用。
0x00 前言
文章开篇我们先来介绍一下什么是HTTP
分块传输。
HTTP
分块传输(Chunked Transfer Encoding)是一种HTTP
协议在数据传输时的编码格式,它允许将数据分成若干个块进行传输。每个传输的块都包含大小信息和实际的数据内容。
HTTP
分块传输常用于在不知道响应内容长度情况下传输数据。例如,当服务器需要生成大量数据或数据需要动态生成时,它可以使用HTTP
分块传输来在响应正在生成时向客户端传输数据。
在HTTP
分块传输中,每个块使用十六进制数表示的大小信息开头,并以'rn'
换行符结束。该大小信息表示块包含的字节数。块的实际数据由该大小信息所指定的数量的字节组成,并以'rn'
结束。最后一个块的大小信息为0
,后面跟着一个空白的'rn'
,表示所有的块都已传输完成。
HTTP
分块传输不仅适用于响应内容的传输,还可以用于请求数据的发送,在渗透的过程中,当我们遇到网站存在waf
的情况,我们就可以利用HTTP
分块传输来绕过waf
的检测。
0x01 分块传输格式
HTTP
分块传输是HTTP
协议的一种数据编码方式,其传输格式如下:
chunk-size [ chunk-extension ] CRLF
chunk-data CRLF
...
chunk-size [ chunk-extension ] CRLF
chunk-data CRLF
0 CRLF
footer1-name: footer1-value CRLF
footer2-name: footer2-value CRLF
CRLF
其中,chunk-size
表示当前块的字节数,并以十六进制数字表示,chunk-extension
可选,表示当前块的扩展信息,使用分号和值进行分隔。CRLF
表示回车换行符。chunk-data
表示当前块的数据内容。所有块的数据内容累加起来就是完整的实体正文。
最后一个长度为0
的块表示传输结束。
在传输过程中,每个块都需要以chunk-size
开始并加上后缀CRLF
,接下来是 chunk-data
,最后也要以CRLF
结束。
如果有多个块,则依次传输,每个块之间也要用CRLF
分隔。
在所有块发送完成后,可以选择添加一个或多个实体报头字段,这些字段被称为报尾或尾部(footers
)。报尾同样需要以CRLF
结束。
总之,HTTP
分块传输用于在HTTP
协议中动态传输数据,其传输格式是由块大小和块数据组成,可以在数据生成过程中逐步传输数据,提高效率和安全性。
客户端和服务端在进行HTTP
分块传输时,需要注意以下几点:
-
客户端需要在请求头部添加
Transfer-Encoding: chunked
,告知服务端使用分块传输方式。 -
服务端需要在响应头部添加
Transfer-Encoding: chunked
,告知客户端使用分块传输方式。 -
服务端需要将所有数据按照块的格式进行封装并发送给客户端。
0x02 利用 Burp 插件分块传输
2.1 chunked-coding-converter
下面以本地搭建的sqli-labs
环境进行漏洞演示,如果网站没有安装waf
,构造如下请求数据包可以正常返回数据,如下图所示。
但是实际上在日常漏洞挖掘过程中,往往都会遇到waf
的情况,如下图所示。
因此,我们可以利用github
项目chunked-coding-converter
工具,对传输的数据进行分段传输,绕过waf
以达到我们想要的目的。
项目地址:
https://github.com/c0ny1/chunked-coding-converter
抓取数据包在repeater
模块右击选择工具Chunked coding converter
对数据包的请求体进行chunked
编码。
可以发现使用了分块传输的数据包,可以绕过waf
获取数据库数据。
2.2 搭配 sqlmap 跑注入
当然网站存在waf
,使用sqlmap
也会被拦截,我们可以将sqlmap
代理到Burp
中,使用chunked-coding-converter
插件对Proxy
流量进行编码处理,来绕过waf
。
0x03 总结
分块传输还有很多有趣的玩法,我们一起探索8️⃣~
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
点此亲启
原文始发于微信公众号(宸极实验室):『红蓝对抗』论 HTTP 分块传输的应用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论