CL.0 Desync与HTTP流水线的区别及服务器漏洞判定咨询
判断CL.0 Desync攻击漏洞:正常HTTP流水线vs漏洞现象
我正在排查服务器是否存在CL.0 Desync攻击漏洞,用Blurp Community Edition做了两组测试,但没法确定测试1的结果是HTTP流水线的正常行为还是CL.0 Desync现象。
测试1:带Content-Length:0的请求
请求内容
POST /login HTTP/1.1 Host: 127.0.0.1 Referer: https://127.0.0.1 Content-Length: 0 GET /api/status HTTP/1.1 Host: 127.0.0.1 Connection: keep-alive
响应结果
HTTP/1.1: 401 Unauthorized Set-Cookie: .... X-Content-Type-Options: nosniff X-Frame-Options: DENY Cache-Control: must-revalidate,no-cache,no-store X-XSS-Protection: 1; mode=block Strict-Transport-Security: max-age=31536000 ; includeSubDomains Content-Length: 74 HTTP Status 401 - Full authentication is required HTTP/1.1: 401 Unauthorized Date: Wed, ... X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Strict-Transport-Security: max-age=31536000 ; includeSubDomains Content-Length: 74 HTTP Status 401 - Full authentication is required
由于未传递令牌,两个端点返回401是预期结果。
测试2:不带Content-Length的请求
请求内容
POST /login HTTP/1.1 Host: 127.0.0.1 Referer: https://127.0.0.1 GET /api/status HTTP/1.1 Host: 127.0.0.1 Connection: keep-alive
响应结果
HTTP/1.1: 401 Unauthorized Date: Wed, ... X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Strict-Transport-Security: max-age=31536000 ; includeSubDomains Content-Length: 74 HTTP Status 401 - Full authentication is required
核心区别解析
要区分正常HTTP流水线和CL.0 Desync,关键看服务器对请求边界的解析逻辑:
- 正常HTTP流水线行为:服务器能正确识别同一条长连接里的多个独立请求,每个请求对应一个响应。测试1中服务器返回两个401响应,分别对应
POST /login和GET /api/status,完全符合流水线的核心特征——每个请求都被独立处理并返回对应结果。 - CL.0 Desync现象:漏洞本质是服务器与前端代理(或CDN)对请求边界的解析规则不一致。比如服务器按
Content-Length解析,代理却按分块编码规则解析,会导致请求被错误拆分/合并,出现响应丢失、请求上下文混乱,或后续请求被错误绑定到前一个请求的会话中。
你的测试1中,服务器没有出现任何异常解析行为;测试2中仅返回一个响应,是因为POST请求缺少Content-Length,服务器将后续的GET请求当作POST的请求体处理,属于缺少长度标识时的正常解析逻辑,而非CL.0漏洞。
结论:测试1的结果是正常HTTP流水线行为,CL.0漏洞会表现出更明显的响应不匹配、上下文篡改等异常,而非正确返回每个请求的响应。
内容的提问来源于stack exchange,提问作者CrazyFrog
相关产品推荐
相关产品推荐

