方法1.?
php解析规则:当php进行解析时,如果变量名前面有空格,php会自动去掉前面的空格再进行解析,假如waf不允许num变量接收字母,那么使用 num就可以,而php解析时就会自动把空格去掉
? num=scandir("/")
? num=var_dump(scandir(chr(47)))
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
方法二:
测试发现当我们提交一些字符时,会直接403
。403
?!应该就是走私报错了,经测试发现的确存在服务器存在http走私漏洞,可以用来绕waf。?
前端服务器(CDN)
和后端服务器接收数据不同步,引起对客户端传入的数据理解不一致,从而导致漏洞的产生。
大多数HTTP
请求走私漏洞的出现是因为HTTP
规范提供了两种不同的方法来指定请求的结束位置:Content-Length
标头和Transfer-Encoding
标头。
同时使用两种不同的方法时,Content-Length
无效。当使用多个服务器时,对客户端传入的数据理解不一致时,就会出现有些服务器认为Content-Length
的长度有效,有些以Transfer-Encoding
有效。而一般情况下,反向代理服务器与后端的源站服务器之间,会重用TCP
链接。这样超出的长度就会拼接到下一次请求进行请求,从而导致HTTP
请求走私漏洞。
2、HTTP请求走私攻击的五种方式?
所有不携带请求体的HTTP
请求都有可能受此影响。这里用GET
请求举例。
前端代理服务器允许GET
请求携带请求体;后端服务器不允许GET请求携带请求体,它会直接忽略掉GET
请求中的Content-Length
头,不进行处理。这就有可能导致请求走私。
\r\n是换行的意思,windows的换行是\r\n,unix的是\n,mac的是\r?
GET / HTTP/1.1\r\n
Host: test.com\r\n
Content-Length: 44\r\n
GET / secret HTTP/1.1\r\n
Host: test.com\r\n
\r\n
前端服务器收到该请求,读取Content-Length
,判断这是一个完整的请求。
然后转发给后端服务器,后端服务器收到后,因为它不对Content-Length
进行处理,由于Pipeline的存在,后端服务器就认为这是收到了两个请求,分别是:
第一个:
GET / HTTP/1.1\r\n
Host: test.com\r\n
第二个
GET / secret HTTP/1.1\r\n
Host: test.com\r\n
1、HTTP请求走私测试2(CL-CL漏洞)
两个CL直接导致前端转发的服务器400,而且完整转发了post包给后端。
2、HTTP请求走私测试1(CL-TE漏洞)
CL和TE直接导致前端转发的服务器400,而且完整转发了post包给后端。?
?