PHP字符串解析特性绕过WAF

发布时间:2023年12月22日

[RoarCTF 2019]Easy Calc

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

方法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))

方法二:

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包给后端。

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

?

文章来源:https://blog.csdn.net/m0_73847654/article/details/135138724
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。