使用PHP查询字符串能绕过waf吗
No.1
语法&定义&注释
查询字符串解析到变量,首先看一下parse_str()函数:语法:parse_str(string,array)
定义和用法:
parse_str() 函数把查询字符串解析到变量
使用PHP查询字符串绕过waf No.1 语法&定义&注释 查询字符串解析到变量,首先看一下parse_str()函数:语法:parse_str(string,array) 定义和用法: 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=42]转换为Array([wenson_id] => 42) 如果遇到waf对wenson_id的值进行拦截时,怎么样使用滥用PHP查询字符串解析器来绕过WAF,可以通过以下面方式来绕过这个解析过程: /wenson.php?%20wenson[id=42"+AND+1=0—在PHP中,上面的示例%20wenson[id]中的参数名的值将存储为$_GET["wenson_id"]。 PHP需要将所有参数转换为一个有效的变量名,因此当解析查询字符串时,它主要做两件事: 删除初始空格 将一些字符转换为下划线(包括空格) 通过如下所示的简单循环,您可以使用parser_str函数发现哪个字符被删除或转换为下划线: 在这里可以用foo_bar的值进行fuzz测试,“[X]foo[X]bar[X]”是[X]的标记位,对这个标记位进行测试,如果web服务器接受带点或空白的标题名称PHP字符串变量,也会发生类似的事情。 可以对fuzz测试的一些点: 接下来进行拆分,进行分析: [1st]foo_barfoo[2nd]barfoo_bar[3rd] 可以看出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**%5b**id=1%22+AND+1=1--"/wenson_id****=1%22+AND+1=1--" 如果像ModSecurity的话,使用这个规则的话SecRule !ARGS:wenson_id "@rx ^[0-9]+$",以上的方式是不成功的, 所以在有时候可以这样子绕过waf:所以在绕PHP文件中,遇到类似的parse_str()函数时,可以尝试去绕过。 /test.php?tt 等同于下面的URL地址: /test.php?tt=1&wenson=fsf23424234234ffsdfds No.3 尾言 最后,文章的内容部分参考互联网的文章来写,在绕过的过程中,多尝试一下PHP替代函数进行绕waf。 (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |