PHP字符串解析特性绕过WAF

[RoarCTF 2019]Easy Calc

题目的突破点:
  • 只能传入数字和运算符号,不能传入字符(想办法绕过waf)

方法1. 

php解析规则:当php进行解析时,如果变量名前面有空格,php会自动去掉前面的空格再进行解析,假如waf不允许num变量接收字母,那么使用 num就可以,而php解析时就会自动把空格去掉

PHP字符串解析特性绕过WAF_第1张图片

? num=scandir("/")
? num=var_dump(scandir(chr(47)))
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

方法二:

0x02 http走私攻击介绍

测试发现当我们提交一些字符时,会直接403403?!应该就是走私报错了,经测试发现的确存在服务器存在http走私漏洞,可以用来绕waf。 

1、为什么会形成走私漏洞   博客链接

前端服务器(CDN)和后端服务器接收数据不同步,引起对客户端传入的数据理解不一致,从而导致漏洞的产生。
大多数HTTP请求走私漏洞的出现是因为HTTP规范提供了两种不同的方法来指定请求的结束位置:Content-Length标头和Transfer-Encoding标头。
同时使用两种不同的方法时,Content-Length无效。当使用多个服务器时,对客户端传入的数据理解不一致时,就会出现有些服务器认为Content-Length的长度有效,有些以Transfer-Encoding有效。而一般情况下,反向代理服务器与后端的源站服务器之间,会重用TCP链接。这样超出的长度就会拼接到下一次请求进行请求,从而导致HTTP请求走私漏洞。

2、HTTP请求走私攻击的五种方式 

(1)CL不为0

所有不携带请求体的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包给后端。

PHP字符串解析特性绕过WAF_第2张图片

2、HTTP请求走私测试1(CL-TE漏洞)
CL和TE直接导致前端转发的服务器400,而且完整转发了post包给后端。 

PHP字符串解析特性绕过WAF_第3张图片 

你可能感兴趣的:(php,开发语言)