Apache Struts2远程代码执行漏洞S2-048 CVE-2017-9791 分析和防护方案
今天,Apache Struts官方发布公告,漏洞编号为S2-048 CVE-2017-9791,公告称Struts2和Struts1中的一个Showcase插件可能导致远程代码执行,并评价为高危漏洞。 绿盟科技发布分析和防护方案,其中开放了在线检测工具
https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12
通告全文如下
Apache Struts2远程代码执行漏洞S2-048 CVE-2017-97912017年7月7日,Apache Struts发布最新的安全公告,Apache Structs2的strus1插件存在远程代码执行的高危漏洞,漏洞编号为 CVE-2017-9791 ( S2-048 )。攻击者可以构造恶意的字段值通过Struts2的Struts1的插件,远程执行代码。
相关链接如下:
https://cwiki.apache.org/confluence/display/WW/S2-048
影响版本: Apache Struts Version: 2.3.x
不受影响的版本: Apache Struts Version:2.5.10.1
(数据来自绿盟科技威胁情报中心NTI)
Struts2远程代码执行漏洞S2-048防护方案 官方解决方案官方已经发布了版本更新,建议用户升级到Struts 2.5.10.1版本,下载链接如下所示:
临时修复方案 开发者通过使用资源调用方式替代原始值传递方式给ActionMessage的方式。 如下所示:
messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));
不要使用如下的方式:
messages.add("msg", new ActionMessage("Gangster " + gform.getName() + " was added"));
在非必要的情况下禁用struts2-struts1-plugin插件。将struts2-struts1-plugin-2.3.x.jar文件从 “/WEB-INF/lib”目录中移动到其他文件夹或者删除。 技术防护方案绿盟科技检测方案
如果您不清楚是否受此漏洞影响,公网资产可使用绿盟云紧急漏洞在线检测,检测地址如下: https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12内网资产可以使用绿盟科技的远程安全评估系统(RSAS V6 )或 Web应用漏洞扫描系统(WVSS) 进行检测。 远程安全评估系统(RSAS V6) http://update.nsfocus.com/update/listRsasDetail/v/vulweb Web应用漏洞扫描系统(WVSS) http://update.nsfocus.com/update/listWvssDetail/v/6/t/plg
绿盟科技服务方案
绿盟科技提供专业的安全技术服务,全方位的保障客户应用系统安全,避免受此漏洞影响。
短期服务:我们可以提供应急服务,服务内容包括对客户应用系统有针对性的提供修复建议,保障客户系统的安全升级。 中长期服务:结合绿盟科技检测与防护产品,提供7*24的安全运营服务,在客户应用系统遭到安全威胁时第一时间通知客户,并定期进行安全检测,针对安全风险提供专业的解决方案。官方的漏洞描述如下:
从官方的漏洞描述可以知道,这个漏洞本质上是在struts2-struts1-plugin这个jar包上。这个库是将struts1的action封装成struts2的action以便在strut2上使用。本质问题出在struts2-struts1-plugin包Struts1Action.java文件中,Struts1Action类中的execute方法调用了getText函数,这个函数会执行ognl表达式,更为严重的是getText的输入内容是攻击者可控的。以下会基于struts2的官方示例进行分析。
Struts1Action的execute方法代码如下,从红框中信息可以看出其实质是调用SaveGangsterAction.execute方法,然后再调用getText(msg.getKey()….)。
在struts2-showcase的integration模块下有SaveGangsterAction类的execute方法(位于SaveGangsterAction.java文件)用于实现。具体如下:
在这个方法中就带入有毒参数gforn.getName()放到了messages结构中,gform.getName()的值是从客户端获取的。
Gangsterform.getName()的实现如下:
这里传入了${1+1},有毒参数已经带入,就差ognl表达式,继续回到Struts1Action类的execute方法下半部分,有getText()的入口,能清晰看到参数已经被污染,具体如下图:
下面进入getText的实现函数,这个调用栈比较深,首先我们给出栈图:
从Struts1action.execute函数开始,到ActionSupport的getText()方法,方法如下:
进入TextProviderSuppport.getText,调用其另一个重载类方法getText(),示例如下:
进入LocalizeTextUtil.findText,继续分析其实现:从名字上也能看出其是根据用户的配置做一些本地化的操作。代码如下:
到这里就能发现这就是一个很典型的ognl表达式入口,先是得到一个valueStack,再继续递归得到ognl表达式的值。官方参考链接:
最后附上一个简单的测试用例图:
本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。
原文发布时间:2017年7月7日
本文由:安全加 发布,版权归属于原作者
原文链接:http://toutiao.secjia.com/apache-struts2-rce-cve-2017-9791#
本文来自云栖社区合作伙伴安全加,了解相关信息可以关注安全加网站
相关文章
- Apache模块mod_security 和 Nginx过滤配置
- Apache Log4j2远程代码执行漏洞攻击,华为云安全支持检测拦截
- Apache服务停止:信号灯超时时间已到,指定的网络名不再可用
- Apache Httpd 安装 AH00558错误
- Apache Log4j爆“核弹级“漏洞,对众多java应用平台造成影响,已发现近万次攻击
- Apache Log4j2 RCE 命令执行漏洞预警及修复方案
- Apache Tomcat远程命令执行漏洞(CVE-2017-12615) 漏洞利用到入侵检测
- Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过!!
- 俄罗斯人被禁止使用Arial等字体;马斯克欲434亿美元私有化Twitter;Apache Struts2曝高危漏洞|极客头条
- 更快,可扩展性更强的 Apache Cassandra 4.0 正式发布
- Apache Tika任意代码执行漏洞CVE-2016-6809 如不升级则需MATLAB文件解析功能
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [1, 0, param1, param2]
- 绿盟科技网络安全威胁周报2017.16 建议关注Apache Log4j反序列化漏洞CVE-2017-5645
- 绿盟科技网络安全威胁周报2017.11 关注Apache Struts2 任意代码执行漏洞 CVE-2017-5638
- 微服务开发框架-----Apache Dubbo
- 深入理解Apache Hudi异步索引机制
- 中间件安全—Apache常见漏洞
- NoClassDefFoundError: org/apache/juli/logging/LogFactory
- Tomcat- java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet
- Apache-系统-网络部分配置
- org.apache.ibatis.binding.BindingException: Mapper method 'attempted to return null from a method with a primitive return type (long).
- [ vulhub漏洞复现篇 ] Apache Log4j Server 反序列化命令执行漏洞 CVE-2017-5645
- Apache Tomcat Session 反序列化代码执行漏洞(CVE-2021-2532)