标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2024-25] 作者: ecawen 发表于: [2017-07-08] [2017-07-08]被用户:ecawen 修改过
本文共 [584] 位读者顶过
一、漏洞分析1.1漏洞背景Apache的Struts2是一个优雅的,可扩展的开源MVC框架,主要用于创建企业级的Java Web应用程序。在Struts 2.3.X系列的Showcase插件中演示Struts2整合Struts 1的插件中存在一处任意代码执行漏洞。当你的Web应用使用了 Struts 2 Struts 1插件, 则可能导致Struts2执行由外部输入的恶意攻击代码。
[出自:jiwo.org] 1.2漏洞影响Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本
二、漏洞复现这里我们测试的是2.3.24版本中的showcase演示演示示例 下载struts-2.3.24-apps.zip,解压当中的showcase 的war包到tomcat下 漏洞示例触发位置在SaveGangsterAction.java中 找到itegration中的struts1 intergeration 打开后演示如下: 随便填完submit然后抓包
修改 content-type,poc还是利用的OGNL,跟之前的s2-045和s2-046差不多
可以看到成功执行了whoami命令 获得了system权限
三. 漏洞分析3.1漏洞条件
漏洞是在struts2中开启了struts1的插件,org.apache.struts2.s1.Struts1Action类是把封装了struts1的Action 以便兼容在struts2中。
3.2漏洞触发点漏洞出在org.apache.struts2.s1.Struts1Action类的execute方法中, 首先这里ActionForward forward = action.execute(mapping, actionForm, request, response);会把表单的请求处理回显给客户端 然后addActionMessage(getText(msg.getKey(), Arrays.asList(msg.getValues())));这里又调用了getText方法 会把action messages传递给com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage , 最后在其中又调用了com.opensymphony.xwork2.util.TextParseUtil.translateVariables,它用来调用OGNL 表达式用处理字符串表达式。漏洞利用OGNL表达式执行任意命令。
四、 修复建议4.0影响版本Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本 4.1漏洞检测 (检测是否存在漏洞的方法)检查Struts2框架的版本号 4.2补丁地址暂无补丁,请升级到最新版Struts2 4.3手工修复4.3.1不启用struts2-struts1-plugin插件 4.3.2建议升级到最新版本2.5.10.1 4.3.3开发者通过使用resource keys替代将原始消息直接传递给ActionMessage的方式。 如下所示 messages.add(“msg”, new ActionMessage(“struts1.gangsterAdded”, gform.getName())); 一定不要使用如下的方式 messages.add(“msg”, new ActionMessage(“Gangster ” + gform.getName() + ” was added”)); |