HTTP Request Smuggling via Unconsumed GET Request Body 漏洞概述 cpp-httplib v0.38.0 存在HTTP请求走私漏洞。服务器的静态文件处理程序在未消耗请求体的情况下返回GET响应。在HTTP/1.1 keep-alive连接上,未读取的请求体字节保留在TCP流中,并被解释为新HTTP请求的起始部分。攻击者可在GET请求体中嵌入任意HTTP请求,服务器会将其作为独立请求处理。 此外,服务器接受同时包含Content-Length和Transfer-Encoding头部的请求而不拒绝,违反RFC 9112 6.3,在反向代理部署中启用CL+TE走私变体。 影响范围 受影响组件 (line 11580) - 文件处理程序未消耗请求体即返回 (line 5629) - keep-alive循环重用含未读数据的连接 (line 7249) - 同时接受CL和TE而不拒绝 漏洞影响 请求走私: 攻击者可在keep-alive连接上走私任意HTTP请求 访问控制绕过: 走私请求绕过代理层认证/授权 缓存投毒: 在代理缓存架构中,走私响应可能被缓存到错误URL 请求劫持: 反向代理后,走私请求可能与其他用户的请求配对 修复方案 1. 消耗或排空请求体后再重用keep-alive连接 发送响应后,若请求包含Content-Length或Transfer-Encoding头部,服务器必须在处理同连接上的下一个请求前读取并丢弃剩余请求体。若未消耗请求体,可选择关闭连接。 2. 拒绝同时包含CL和TE的请求 按RFC 9112 6.3规定,对同时包含Content-Length和Transfer-Encoding头部的请求返回400 Bad Request响应。 3. 在keep-alive循环中添加请求体排空机制 在 的迭代之间,根据前一个请求指示的body长度,从流中排空任何未完全消耗的未读数据。 POC利用代码 测试结果