分块传输

最近在freebuf上看到有利用分块传输绕过waf的文章,然后就学习了一下什么是分块传输。

首先给出分块传输的维基百科定义:

1
分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。

所以我们可以看到,该定义详细说明了是只在HTTP1.1的版本中才会提供。
具体利用的话,其实也很简单
给一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1C
and this is the second one

3
con

8
sequence

0

其中每段上面的字符就是下面字符长度的16进制大小,解释如下:

1
2
3
4
5
6
7
前两个块的数据中包含有显式的\r\n字符。

"This is the data in the first chunk\r\n" (37 字符 => 十六进制: 0x25)
"and this is the second one\r\n" (28 字符 => 十六进制: 0x1C)
"con" (3 字符 => 十六进制: 0x03)
"sequence" (8 字符 => 十六进制: 0x08)
应答需要以0长度的块( "0\r\n\r\n".)结束。