漏洞名称 : Apache Struts2远程代码执行漏洞(CVE-2020-17530)
威胁等级 : 高危
影响范围 : Apache Struts 2.0.0 - 2.5.25
漏洞类型 : 远程代码执行
利用难度 : 中等
漏洞分析
1 Apache Struts2 组件介绍
Struts2是一个基于MVC设计模式的Web应用框架。在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。
2 漏洞描述
深信服千里目安全实验室在2020年12月08日监测到Apache Struts2存在一个远程代码执行漏洞(S2-061)。Struts2在某些标签属性中使用OGNL表达式时,因为没有做内容过滤,在传入精心构造的请求时,可以造成OGNL二次解析,执行指定的远程代码。攻击者可以通过构造恶意请求利用该漏洞,成功利用此漏洞可以造成远程代码执行。
3 漏洞分析
在Struts2 2.5.26版本的补丁中,主要进行两处修补,如下图。
第一处修补,对S2-061漏洞利用的标签属性进行修复。第二处修补,添加了黑名单类。
首先进入org.apache.struts2.views.jsp.ui.AbstractUITag类,重点关注补丁删除的if代码块。If会判断是否开启altSyntax,且判断属性的value是否为表达式。如果条件满足,则将key与赋值后的value写入dynamicAttributes中。
调用org.apache.struts2.views.jsp.ComponentTagSupport#doStartTag方法进行标签解析,在此方法中调用populateParams,进入父类AbstractUITag的populateParams方法。
在AbstractUITag#populateParams方法中会调用各种uiBean.set方法对属性进行赋值,最终也会调用uiBean.setDynamicAttributes(dynamicAttributes)方法,对前文选中的动态属性进行赋值。
最终调用ComponentTagSupport#doEndTag,结束标签的解析。在调用此方法的过程中会调用engine.renderTemplate(context)方法进行模板渲染。
中间会循环调用visit方法选择模板
直接跟进到选择dynamic-attributes.ftl模板进行页面渲染,
解析模板中的元素,当解析到<#assign value = struts.translateVariables(keyValue)!keyValue/>时,会调用freemarker.core
.Assignment#accept方法,并在此方法中调用this.valueExp.eval方法,解析env环境变量中的表达式。
最终通过反射调用org.apache.struts2.util.StrutsUtil#translateVariables方法进行ognl表达式解析。
综上是S2-061的漏洞的表达式注入过程,接下来分析新版本中新增的黑名单类在ognl表达式payload中的作用。
这里参考Smi1e师傅的文章,选择黑名单类中,与tomcat相关的org.apache.catalina.core.DefaultInstanceManager类进行分析。
基于tomcat服务器启动的struts2框架,在获取的OgnlContext中的ApplicationMap中可以通过org.apache.tomcat.InstanceManager键值,找到对应的org.apache.catalina.core.DefaultInstanceManager类。
DefaultInstanceManager类中存在newInstance方法,利用此方法可以执行任意类中的无参构造方法。
同时,存在一个org.apache.commons.collections.BeanMap类,通过调用setBean方法,将传入的对象作为bean。
通过调用BeanMap#get(Object name)方法,执行bean中的get方法
通过上述无参构造方法的类的实例化方法,以及类中get方法的调用。可以构造利用链,调用com.opensymphony.xwork2.ognl.OgnlValueStack#getContext方法,获取OgnlContext。
获取到OgnlContext对象后,可以继续调用该对象中的get方法,这里通过调用getMemberAccess方法,获取_SecurityMemberAccess对象。
此时可以通过模拟Struts2 2.5.2版本的payload,将黑名单清空。最终调用黑名单的类,进行RCE。
4 漏洞复现
搭建Struts 2.5.25版本的环境,运行sniper,填写表单信息,点击Attack,效果如图。
影响范围
目前受影响的Apache Struts2版本:
Apache Struts 2.0.0 - 2.5.25
解决方案
1 修复建议
目前厂商已发布升级补丁修复漏洞,请受影响用户及时更新官方补丁。官方链接如下:
https://github.com/apache/struts
2 深信服解决方案
【深信服下一代防火墙】可轻松防御此漏洞, 建议部署深信服下一代防火墙的用户更新至最新的安全防护规则,可轻松抵御此高危风险。
【深信服云盾】已第一时间从云端自动更新防护规则,云盾用户无需操作,即可轻松、快速防御此高危风险。
【深信服安全感知平台】可检测利用该漏洞的攻击,实时告警,并可联动【深信服下一代防火墙等产品】实现对攻击者ip的封堵。
【深信服安全运营服务】深信服云端安全专家提供7*24小时持续的安全运营服务。对存在漏洞的用户,检查并更新了客户防护设备的策略,确保客户防护设备可以防御此漏洞风险。
时间轴
2020/12/08 Apache Struts2官方披露该漏洞
2020/12/08 深信服千里目安全实验室检测该漏洞并发布漏洞安全通告
2020/12/10 深信服千里目安全实验室分析复现漏洞,发布漏洞分析文章,并发布产品解决方案
参考链接
https://github.com/apache/struts
点击阅读原文,及时关注并登录深信服智安全平台,可轻松查询漏洞相关解决方案。
深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。
● 扫码关注我们
本文始发于微信公众号(深信服千里目安全实验室):【更新】Apache Struts2 远程代码执行漏洞(CVE-2020-17530)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论