strut2 升级至2.3.20

谁说我不能喝 提交于 2019-12-02 20:29:48

问题现象:

Apache Struts s2-005 远程代码执行漏洞(CVE-2010-1870) 

受影响版本:

Struts 2.0.0 - Struts 2.1.8.1

漏洞描述:

在Struts2中访问OGNL的上下文对象必须要使用#符号,S2-003的修复方案中对#号进行过滤,但是没有考虑到unicode编码情况,导致\u0023或者8进制\43绕过。

http://struts.apache.org/docs/s2-005.html

 

Apache Struts s2-008 远程代码执行漏洞(CVE-2012-0392)

受影响版本:

Struts 2.1.0 - Struts 2.3.1

漏洞描述:

Struts2框架存在一个DevMode模式,方便开发人员调试程序。如果启用该模式,攻击者可以构造特定代码导致OGNL表达式执行,以此对主机进行入侵。

http://struts.apache.org/docs/s2-008.html

 

Apache Struts s2-016 远程代码执行漏洞(CVE-2013-2251) 

受影响版本:

Struts 2.0.0 - Struts 2.3.15

漏洞描述:

在Struts2中,DefaultActionMapper类支持以"action:"、"redirect:"、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式。由于Struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。

http://struts.apache.org/docs/s2-016.html

 

Apache Struts s2-019 远程代码执行漏洞(CVE-2013-4316)

受影响版本:

Struts 2.0.0 - Struts 2.3.15.1

漏洞描述:

Struts2的“动态调用机制(Dynamic Method Invocation)”存在数量不少的漏洞,一直以来都被各类攻击手法所利用。但“动态调用机制”在2.3.15.1版本以前都是默认打开状态,用户应该把它禁用掉。

http://struts.apache.org/docs/s2-019.html

 

Apache Struts s2-020 远程代码执行漏洞(CVE-2014-0094)

受影响版本:

Struts 2.0.0 - Struts 2.3.16

漏洞描述:

Apache Struts 2.0.0-2.3.16版本的默认上传机制是基于Commons FileUpload 1.3版本,其附加的ParametersInterceptor允许访问'class' 参数(该参数直接映射到getClass()方法),并允许控制ClassLoader。在具体的Web容器部署环境下(如:Tomcat),攻击者利用 Web容器下的Java Class对象及其属性参数(如:日志存储参数),可向服务器发起远程代码执行攻击,进而植入网站后门控制网站服务器主机。

http://struts.apache.org/docs/s2-020.html

 

 

 

问题分析过程:

1)升级至最新版本2.3.20;

Struts.xml :

Struts 2.3.20 配置文件新增加了参数为struts.excludedClasses,此参数为了严格验证排除一些不安全的对象类型。

 

              value="

                java.lang.Object,

                java.lang.Runtime,

                java.lang.System,

                java.lang.Class,

                java.lang.ClassLoader,

                java.lang.Shutdown,

                ognl.OgnlContext,

                ognl.MemberAccess,

                ognl.ClassResolver,

                ognl.TypeConverter,

                com.opensymphony.xwork2.ActionContext" />

 

升级注意事项:

替换jar包:

l  xwork-core-2.3.20.jar

l  struts2-json-plugin-2.3.20.jar

l  struts2-core-2.3.20.jar

l  commons-lang3-3.2.jar

l  freemarker-2.3.19.jar

l  asm-x.x.jar

l  asm-commons-x.x.jar

l  asm-tree-x.x.jar

l  commons-io-X.X.X.jar

l  commons-lang3-X.X.X.jar

l  commons-fileupload-X.X.X.jar

l  freemarker-X.X.X.jar

l  javassist-X.X.X.jar

l  ognl-X.X.X.jar

l  struts2-core-X.X.X.X.jar

l  xwork-core-X.X.X.jar

l  struts2-spring-plugin-2.3.20.jar

 

项目struts.xml文件添加

 第一句 修改为:

      

 

2) S2-016和S2-017修复步骤:

      重写struts2 DefaultActionMapper的handleSpecialParameters方法,增加action、redirect、redirectAction等参数的过滤。此方法可修补S2-016、S2-017漏洞。
  操作步骤:
    2.1 新建com/website/struts2/MyDefaultActionMapper.java,代码如下:
    2.2 复制MyDefaultActionMapper.class 到 /com/website/struts2/目录。
    2.3 用struts.xml添加如下代码:
    2.4 重启服务器。

      

public class MyDefaultActionMapper extends DefaultActionMapper {
    public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) {
        Set uniqueParameters = new HashSet();
        Map parameterMap = request.getParameterMap();
        for (Iterator iterator = parameterMap.keySet().iterator(); iterator.hasNext();) {
            String key = (String) iterator.next();

            if ((key.endsWith(".x")) || (key.endsWith(".y"))) {
                key = key.substring(0, key.length() - 2);
            }

            // -- jason.zhou 20130708 add start -- //
            if ((key.contains("redirect:")) || (key.contains("redirectAction:")) || (key.contains("action:"))) {
                return;
            }
            // -- jason.zhou 20130708 add end -- //
            
            if (!uniqueParameters.contains(key)) {
                ParameterAction parameterAction = (ParameterAction) this.prefixTrie.get(key);
                if (parameterAction != null) {
                    parameterAction.execute(key, mapping);
                    uniqueParameters.add(key);
                    break;
                }
            }
        }
    }
}

    

struts.xml

 

<!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper -->  
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class="com.website.struts2.MyDefaultActionMapper" />    
<constant name="struts.mapper.class" value="myDefaultActionMapper" />



 


问题处理结论:可以使用工具进行漏洞修复检测(K8 Struts2 Exploit_20140731.rar


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!