借鉴了一些大佬的帖子, 补充+总结了一下

五种常见走私请求

CL不为0的GET请求

假设前端代理服务器允许GET请求携带请求体,而后端服务器不允许GET请求携带请求体,它会直接忽略掉GET请求中的Content-Length头,不进行处理。这就有可能导致请求走私。

CL-CL

假设中间的代理服务器和后端的源站服务器在收到类似的请求时,都不会返回400错误,但是中间代理服务器按照第一个Content-Length的值对请求进行处理,而后端源站服务器按照第二个Content-Length的值进行处理,这样便有可能引发请求走私。

TE-TE

同上, 只不过换一个key name, 可以尝试:

Transfer-Encoding: xchunked Transfer-Encoding : chunked Transfer-Encoding: chunked Transfer-Encoding: x Transfer-Encoding:[\t]chunked Transfer-Encoding: chunked Transfer-Encoding : chunked

CL-TE

当收到存在两个请求头的请求包时,前端代理服务器只处理Content-Length这一请求头,而后端服务器会遵守RFC2616的规定,忽略掉Content-Length,处理Transfer-Encoding这一请求头。

POST / HTTP/1.1 Host: 127.0.0.1 Content-Length: 28 Transfer-Encoding: chunked 0 GET /admin HTTP/1.1

Content-Length需要设置为从0开始的所有字节数\r\n2**

TE-CL

当收到存在两个请求头的请求包时,前端代理服务器处理Transfer-Encoding这一请求头,而后端服务器处理Content-Length请求头。

POST / HTTP/1.1 Host: 127.0.0.1 Content-Length: 4 Transfer-Encoding: chunked 26 GET /admin HTTP/1.1 Host: localhost 0

Content-Length需要设置为body长度+2\r\n
body中的26是从换行后算起, 到0之前的全部字节长度\r\n2, 并转为16进制

https://misakikata.github.io/2020/03/HTTP-%E8%AF%B7%E6%B1%82%E8%B5%B0%E7%A7%81/
https://paper.seebug.org/1048/#4-httpcve-2018-8004
https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-cl-te

如果觉得我的文章对你有用,请随意赞赏