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
相关产品推荐
相关产品推荐

