漏洞名称
:
Apache Struts2远程代码执行漏洞(CVE-2020-17530)
威胁等级
:
高危
影响范围
:
Apache Struts 2.0.0 - 2.5.25
漏洞类型
:
远程代码执行
利用难度
: 中等
Struts2是一个基于MVC设计模式的Web应用框架。在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。
深信服千里目安全实验室在2020年12月08日监测到Apache Struts2存在一个远程代码执行漏洞(S2-061)。Struts2在某些标签属性中使用OGNL表达式时,因为没有做内容过滤,在传入精心构造的请求时,可以造成OGNL二次解析,执行指定的远程代码。攻击者可以通过构造恶意请求利用该漏洞,成功利用此漏洞可以造成远程代码执行。
在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)方法进行模板渲染。
直接跟进到选择dynamic-attributes.ftl模板进行页面渲染,
解析模板中的元素,当解析到时,会调用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。
搭建Struts 2.5.25版本的环境,运行sniper,填写表单信息,点击Attack,效果如图。
目前受影响的Apache Struts2版本:
Apache Struts 2.0.0 - 2.5.25
目前厂商已发布升级补丁修复漏洞,请受影响用户及时更新官方补丁。官方链接如下:
https://github.com/apache/struts
【
深信服下一代防火墙
】可轻松防御此漏洞, 建议部署深信服下一代防火墙的用户更新至最新的安全防护规则,可轻松抵御此高危风险。
【
深信服云盾
】已第一时间从云端自动更新防护规则,云盾用户无需操作,即可轻松、快速防御此高危风险。
【
深信服安全感知平台
】可检测利用该漏洞的攻击,实时告警,并可联动【深信服下一代防火墙等产品】实现对攻击者ip的封堵。
【
深信服安全运营服务
】深信服云端安全专家提供7*24小时持续的安全运营服务。对存在漏洞的用户,检查并更新了客户防护设备的策略,确保客户防护设备可以防御此漏洞风险。