HTTP请求走私简介
HPPT请求走私是一种干扰网站处理HTTP请求系列方式的技术,请求走私大多发生于前端服务器对客户端传入的数据理解不一致的情况。这是因为HTTP规范提供了两种不同的方法来指定请求的结束位置,即Content-Length和Transfer-Encoding标头。
分类
- CLTE:前端服务器使用Content-Length头,后端服务器使用Transfer-Encoding头
- TECL:前端服务器使用Transfer-Encoding标头,后端服务器使用Content-Length标头。
- TETE:前端和后端服务器都支持Transfer-Encoding标头,但是可以通过以某种方式来诱导其中一个服务器不处理它。
CL不为0的GET请求
当前端服务器允许GET请求携带请求体,而后端服务器不允许GET请求携带请求体,它会直接忽略掉GET请求中的Content-Length头,不进行处理。
前端服务器处理了Content-Length,而后端服务器没有处理Content-Length,基于pipeline机制认为这是两个独立的请求,就造成漏洞的发生。
CL-CL
根据RFC7230,当服务器收到的请求中包含两个Content-Length,而且两者的值不同时,需要返回400错误,但是有的服务器并没有严格实现这个规范。这种情况下,当前后端各取不同Content-Length值时,就会出现漏洞。
CL-TE
CL-TE指前端服务器处理Content-Length这一请求头,而后端服务器忽略掉Content-Length,处理Transfer-Encoding。
TE-CL
TE-CL指前端服务器处理Transfer-Encoding请求头,而后端服务器处理Content-Length请求头。
TE-TE
TE-TE指前后端服务器都处理Transfer-Encoding请求头,但是在容错性上表现不同,例如有的服务器可能会处理Transfer-encoding。
防御
- 禁用后端连接重用
- 确保连接中的所有服务器具有相同的配置
- 拒绝有二义性的请求