分块传输学习
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就好。