每日一洞 | 分块传输学习

Posted j0ng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一洞 | 分块传输学习相关的知识,希望对你有一定的参考价值。

分块传输学习

1. 前言

最近面试看文章之余碰到了分块传输的知识点,其实早在2019年就知道了这个名词但是一直没有深入的看过,在这里天上前面的坑。

2. 什么是分块传输?

首先分块传输只支持http1.1,http1.1引入了分块传输的编码方式只要在代码头部分加入Transfer-Encoding: chunked,就代表这个报文采用了分块编码。此时不用指定Content-Length接收方也可以知道什么时候传输结束了,只需要约定一个信号即可,比如,接收方只要接收到一个长度为0内容为0的分块,则代表传输完毕。

那么怎么样将一个普通的报文改编成分块传输形式的呢?

报文中的实体需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(rn),也不包括分块数据结尾的 CRLF。最后一个分块长度值必须为 0,对应的分块数据没有内容(两个空行),表示实体结束。

下面是一个post的数据

POST /api.php HTTP/1.1

Host:127.0.0.1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0

Accept: */*

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-

US;q=0.3,en;q=0.2

Connection: close

Referer: 127.0.0.1

Cookie: phpsessionid

Content-Type: application/x-www-form-urlencoded

Content-Length: 25

id=123456```


比如一个post的数据包其内容为id = 123456;一般get方式是不会有Content-Length的因为url传输时限制了它的长度,但是post没有,所以我们就需要有这个字段来让后端判断数据的长度,如果没有字段这个地方就接受不到。

这里我们就可以使用分块传输的方式,改为分块传输后的内容如下。

POST /api.php HTTP/1.1

Host: 127.0.0.1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0

Accept: /

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Connection: close

Referer: 127.0.0.1

Cookie: phpsessionid

Content-Type: application/x-www-form-urlencoded

Content-Length: 39

Transfer-Encoding: chunked

3

id=

1

1

1

2

2

34

2

56

0


最后有两行空格(代表着结束),这就是分块传输的格式3代表下面将会有3个字符(id=),但是后来一些waf对其的检测格式更加的严格了所以我们采用了下面的方式其中‘;‘代表着注释,格式如下
‘‘‘
POST /api.php HTTP/1.1

Host: 127.0.0.1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0

Accept: */*

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Connection: close

Referer: 127.0.0.1

Cookie: phpsessionid

Content-Type: application/x-www-form-urlencoded

Content-Length: 74

Transfer-Encoding: chunked

3;Twz1NRI1ihKTtxwqWuWTDEV4

id=

3;Hmd8LkqmPRVlz

123

3;2tEkv

456

0



‘‘‘

##3. 这就是分块传输在渗透测试的利用方法

看了网上的很多方法主要时在注入的时候对于分块传输的利用

总结有下面的方式:

1. 直接对sqlmap进行改动多了一个--chunk的参数然后对其进行注入当然这个方法相当于给你一个新的sqlmap。(来自于jaky表哥:https://pan.baidu.com/s/1xzkjewrOZp-gzuAvdsFEfw? 密码:z0lq)
2. burp的插件去对内容进行一个加密,三表哥的插件地址如下
>https://github.com/c0ny1/chunked-coding-converter

值得一提的是作者给的还是需要去编译给安装好mvn然后在目录中执行mvn package,当前目录会生成target文件里面包含了jar文件,导入burp就好。

以上是关于每日一洞 | 分块传输学习的主要内容,如果未能解决你的问题,请参考以下文章

使用分块传输通过 HTTP POST 流式传输麦克风输出

2-WAF主要过滤方式及绕过(HPP污染&分块传输&垃圾数据)

HTTP协议之chunk编码(分块传输编码)

HTTP协议之chunk编码(分块传输编码)

#WEB安全基础 : HTTP协议 | 0x11 HTTP的分块传输模块

分块上传和断点续传