Apache Struts2存在远程代码执行漏洞,编号CVE-2019-0230。Struts2在某些标签属性中使用OGNL表达式时,因为没有做内容过滤,在传入精心构造的请求时,可以造成OGNL二次解析,执行指定的远程代码。
漏洞名称:Apache Struts远程代码执行漏洞CVE-2019-0230
威胁等级:高危
影响范围:Struts2 2.0.0 - 2.5.20
漏洞类型:远程代码执行
利用难度:中等
漏洞分析
1 Apache Struts2组件介绍
Struts2是一个基于MVC设计模式的Web应用框架。在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。
2 漏洞描述
Struts2在某些标签属性中使用OGNL表达式时,因为没有做内容过滤,在传入精心构造的请求时,可以造成OGNL二次解析,执行指定的远程代码。
<s:url var="url" namespace="/employee" action="list"/><s:a id="%{skillName}" href="%{url}">List available Employees</s:a>
在上面的例子中。如果攻击者可以修改skillName的值,并传入一个恶意的OGNL表达式,最终就可以导致远程代码执行。
3 漏洞分析
搭建Apache Struts2 2.5.16环境,首先直接传入执行代码的ognl表达式。
可以发现在控制台输出如下内容:
从而定位到SecurityMemberAccess类的isAccessible方法,可以发现该方法做了一些过滤,并且上面出现的语句也是在这里输出的:
梳理调用栈,可以找到位于OgnlRuntime类中的isMethodAccessible方法,该方法通过对不同的memberAccess调用不同的isAccessible方法:
结合之前的漏洞,需要将context中的memberAccess属性设置为没做任何过滤的DefaultMemberAccess类。构造流程是首先获取到OgnlUtil类,然后将黑名单package和类的属性置空或者做其他修改,最后修改memberAccess属性。
跳转到OgnlUtil类,发现set方法可以直接实现上述提到的黑名单类和包的覆写,于是一条完整的调用链就提取出来了。
值得一提的是,在2.5.16版本之后,上面提到的set方法由覆写变成追加,所以需要寻找新的置空方式。
4 漏洞复现
搭建Apache Struts 2.5.16漏洞环境,使用构造的payload进行攻击,最终执行指定代码,弹出计算器,效果如图:
影响范围
目前受影响的Struts2版本:
Apache Struts2 2.0.0 - 2.5.20
解决方案
1修复建议
Struts 2.5.22及以后的版本已经防御此漏洞,请受漏洞影响的用户下载最新版本。
下载链接:
https://struts.apache.org/download.cgi#struts2522
2 深信服解决方案
【深信服下一代防火墙】可轻松防御此漏洞,建议部署深信服下一代防火墙的用户更新至最新的安全防护规则,可轻松抵御此高危风险。
【深信服云盾】已第一时间从云端自动更新防护规则,云盾用户无需操作,即可轻松、快速防御此高危风险。
【深信服安全感知平台】可检测利用该漏洞的攻击,实时告警,并可联动【深信服下一代防火墙等产品】实现对攻击者ip的封堵。
【深信服安全运营服务】深信服云端安全专家提供7*24小时持续的安全运营服务。对存在漏洞的用户,检查并更新了客户防护设备的策略,确保客户防护设备可以防御此漏洞风险。
时间轴
2020/8/13
Apache Struts官网披露该远程代码执行漏洞
2020/8/14
深信服千里目安全实验室发布漏洞安全通告
2020/8/27
深信服千里目安全实验室发布漏洞分析文章
参考链接
https://struts.apache.org/download.cgi#struts2522
点击阅读原文,及时关注并登录深信服智安全平台,可轻松查询漏洞相关解决方案
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论