欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

利用PHP解析字符串函数parse_str的特性来绕过IDS、IPS和WAF

来源:本站整理 作者:佚名 时间:2019-08-13 TAG: 我要投稿


众所周知,PHP将查询字符串(在URL或正文中)转换为$_GET或$_POST中的关联数组。例如:/ ?foo=bar被转换为Array([foo] => "bar")。查询字符串解析过程使用下划线删除或替换参数名称中的某些字符。例如/?%20news[id%00=42被转换为Array([news_id] => 42)。如果IDS / IPS或WAF在news_id参数中有一个用于阻止或记录非数字值的规则,则可以通过滥用此解析过程来绕过它,例如:/news.php?%20news[id%00=42"+AND+1=0–,在PHP中,%20news[id%00中的参数名称的值将存储到$_GET["news_id"]。
PHP需要将所有参数转换为一个有效的变量名,所以当解析查询字符串时,它主要做两件事:
1.删除初始空格;
2.将一些字符转换为下划线(包括空格)。
例如:

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

parse_str.php运行
parse_str用于get、post和cookie。如果你的web服务器接受带有点或空格的标题名称,那么标题也会发生类似的情况。我已经执行了三次上面的循环,枚举参数名称两端的了从0到255的所有字符,结果如下:
[1st]foo_bar
foo[2nd]bar
foo_bar[3rd]


在上述方案中,foo%20bar和foo+bar是等价的,并被解析为foo bar。
Suricata
suricata是一款开源高性能的入侵检测系统,并支持ips(入侵防御)与nsm(网络安全监控)模式,用来替代原有的snort入侵检测系统,完全兼容snort规则语法和支持lua脚本。
对于外行来说,Suricata是一个“开源、成熟、快速和强大的网络威胁检测引擎”,其引擎能够实时进行入侵检测(IDS)、内联入侵预防(IPS)、网络安全监控(NSM)和离线pcap处理。
使用Suricata,你甚至可以定义一个检查HTTP流量的规则。假设你定义了以下这样一个规则:
alert http any any -> $HOME_NET any (\
    msg: "Block SQLi"; flow:established,to_server;\
    content: "POST"; http_method;\
    pcre: "/news_id=[^0-9]+/Pi";\
    sid:1234567;\
)
此规则会检查news_id是否具有非数字值,在PHP中,可以轻松绕过滥用其查询字符串解析器,如下所示:
/?news[id=1%22+AND+1=1--'
/?news%5bid=1%22+AND+1=1--'
/?news_id%00=1%22+AND+1=1--'
在GitHub上搜索时,我发现了有许多针对PHP的Suricata规则可以通过替换下划线,在被检查的参数名称中添加空字节或空格来绕过。具体示例,请点此。
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET CURRENT_EVENTS Sakura exploit kit exploit download request /view.php"; flow:established,to_server; content:"/view.php?i="; http_uri; fast_pattern:only; pcre:"//view.php?i=\d&key=[0-9a-f]{32}$/U"; classtype:trojan-activity; sid:2015678; rev:2;)
正如我们之前看到的那样,可以通过以下方式绕过:
/view.php?i%00=1&%20key=d3b07384d113edec49eaa6238ad5ff00
说实话,改变参数位置就足够了:
/view.php?key=d3b07384d113edec49eaa6238ad5ff00&i=1
WAF (ModSecurity)
PHP查询字符串解析器也可能被滥用以绕过WAF规则,想象一下ModSecurity规则,SecRule !ARGS:news_id "@rx ^[0-9]+$" "block"显然很容易使用相同的绕过技术。幸运的是,在ModSecurity中,你可以通过正则表达式指定查询字符串参数。比如:SecRule !ARGS:/news.id/ "@rx ^[0-9]+$" "block"。
这将阻止所有以下请求:
⛔️/?news[id=1%22+AND+1=1--'
⛔️/?news%5bid=1%22+AND+1=1--'
⛔️/?news_id%00=1%22+AND+1=1--'
PoC
让我们用Suricata和Drupal CMS创建一个PoC,以利用CVE-2018-7600。CVE-2018-7600,该漏洞存在于众多Drupal版本中,攻击者可以使用此漏洞强制运行Drupal的服务器,并执行可能危害Drupal安装的恶意代码。根据具体配置的不同,这也很可能会危及到主机。为了简单起见,我将在两个docker容器上运行Suricata和Drupal,并尝试从Suricata容器中利用Drupal。
我将激活关于Suricata的两条规则:
1.阻止form_id=user_register_form的自定义规则;
2.CVE-2018-7600的 Positive Technologies Suricata规则。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载