1. 首页
  2. 红队技术

使用PHP查询字符串绕过waf

【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。

声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.1语法&定义&注释

查询字符串解析到变量,首先看一下parse_str()函数:语法:parse_str(string,array)

使用PHP查询字符串绕过waf

定义和用法:
parse_str() 函数把查询字符串解析到变量中。
注释:

如果未设置 array 参数,则由该函数设置的变量将覆盖已存在的同名变量。
注释:

php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。

No.2如何绕过waf程序规则

TL;DR,PHP将查询字符串(在URL或body中)转换为$_GET或$_POST中的数组。例如:/?foo=bar变成Array([foo] => “bar”),查询字符串解析过程使用下划线删除或替换参数名称中的某些字符。

例如/?%20wenson[id%00=42]转换为Array([wenson_id] => 42)

如果遇到waf对wenson_id的值进行拦截时,怎么样使用滥用PHP查询字符串解析器来绕过WAF,可以通过以下面方式来绕过这个解析过程:

/wenson.php?%20wenson[id%00=42″+AND+1=0—
在PHP中,上面的示例%20wenson[id%00]中的参数名的值将存储为$_GET[“wenson_id”]。

PHP需要将所有参数转换为一个有效的变量名,因此当解析查询字符串时,它主要做两件事:

删除初始空格

将一些字符转换为下划线(包括空格)

使用PHP查询字符串绕过waf

通过如下所示的简单循环,您可以使用parser_str函数发现哪个字符被删除或转换为下划线:

使用PHP查询字符串绕过waf


在这里可以用foo_bar的值进行fuzz测试,“[X]foo[X]bar[X]”是[X]的标记位,对这个标记位进行测试,如果web服务器接受带点或空白的标题名称,也会发生类似的事情。

使用PHP查询字符串绕过waf

可以对fuzz测试的一些点:

使用PHP查询字符串绕过waf

接下来进行拆分,进行分析:

[1st]foo_bar
foo[2nd]bar
foo_bar[3rd]

使用PHP查询字符串绕过waf

可以看出foo%20bar 等同于 foo+bar ,并且可以被解析为foo bar。如果使用一个正则规则来匹配时:

alert http any any -> $HOME_NET any (\
msg: “Block SQLi”; flow:established,to_server;\
content: “POST”; http_method;\
pcre: “/wenson_id=[^0-9]+/Pi”;\
sid:1234567;\
)

可以使用下面的方式进行绕过:

/?wenson[id=1%22+AND+1=1–‘
/?wenson%5bid=1%22+AND+1=1–‘
/?wenson_id%00=1%22+AND+1=1–‘

如果像ModSecurity的话,使用这个规则的话SecRule !ARGS:wenson_id “@rx ^[0-9]+$”,以上的方式是不成功的,

所以在有时候可以这样子绕过waf:
所以在绕PHP文件中,遇到类似的parse_str()函数时,可以尝试去绕过。

/test.php?tt%00=1&%20wenson=fsf23424234234ffsdfds

等同于下面的URL地址:

/test.php?tt=1&wenson=fsf23424234234ffsdfds

No.3尾言

最后,文章的内容部分参考互联网的文章来写,在绕过的过程中,多尝试一下PHP替代函数进行绕waf。

本文来自Wens0n,经授权后发布,本文观点不代表立场,转载请联系原作者。

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息