struts2 漏洞 S2-016、S2-017修补方案

官方描述:

S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016
S2-017:https://cwiki.apache.org/confluence/display/WW/S2-017

 

============================== 好了,下面是正题 ==============================

struts2漏洞S2-016、S2-017修补方案:

为了排版整齐一点,将代码放在最后。

方案1:
  方案介绍:
    手工修改Ognl.jar源码,增加恶意代码过滤。此方法只能修补S2-016漏洞,但是对以后可能产生的ognl漏洞有预防作用。
  操作步骤:
    1.1 找到项目中ognl-version.jar,然后找到其对应的源码。把源码解压后,导入到eclipse。找到Ongl.java中修改如下代码:
    1.2 将上面修改后的项目通过eclipse导出为ognl-my.jar, 将它放到lib目录。
    1.3 删除原来ognl-version.jar
    1.4 重启服务器。

方案2:
  方案介绍:
    重写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 重启服务器。

注意:
1.方案1中的“恶意代码”和方案2中的“action、redirect、redirectAction”均为hardcode,如有需要可改为从配置文件读取。
2.方案1原则上对系统没有影响,方案2进行了redirect和redirectAction可跳转性测试,但未进行全站测试。
3.方案1和方案2可以同时执行,也可只执行单独一个。

 

附件:

Ognl.java

复制代码
public static Object parseExpression(String expression)
        throws OgnlException {
    // -- jason.zhou 20130718 add start -- // 
    // Runtime、ProcessBuilder为恶意代码,其它可自行添加
    String evalMethod[] = { "Runtime", "ProcessBuilder" };
    String methodString = null;
    methodString = expression.toLowerCase();
    for (int i = 0; i < evalMethod.length; i++) {
        if (methodString.indexOf(evalMethod[i].toLowerCase()) > -1) {
            System.out.print("|OGNL正在执行恶意语句|" + methodString + "|看到这个消息,请联系安全工程师!!!");
            return null;
        }
    } 
    // -- jason.zhou 20130718 add start -- // 

    try {
        OgnlParser parser = new OgnlParser(new StringReader(expression));
        return parser.topLevelExpression();
    } catch (ParseException e) {
        throw new ExpressionSyntaxException(expression, e);
    } catch (TokenMgrError e) {
        throw new ExpressionSyntaxException(expression, e);
    }
}
复制代码

 

 MyDefaultActionMapper.java

复制代码
/**
 * zhounenghua@163.com copyright
 */
package com.website.struts2;

/**
 * @author jason.zhou
 * @date 2013-7-18
 */
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" />  
s2-016是一个Struts2框架中的安全漏洞,修复此漏洞的方式是升级Struts2版本。 首先,我们需要确定当前使用的Struts2版本。通过查看项目依赖或者查看项目中的Struts2相关配置文件,可以得知当前使用的Struts2版本号。 接下来,我们需要查看Struts2的官方文档或者相关的安全公告,了解该版本是否受到s2-016漏洞的影响,以及是否有其他相关漏洞需要修复。 如果当前使用的Struts2版本受到s2-016漏洞的影响,那么我们需要升级到修复了该漏洞的版本。可以从Struts2官方网站或者相关的软件仓库下载最新的稳定版本,然后根据升级指南进行相应的升级操作。 在升级Struts2之前,我们应该先在测试环境中进行一些简单的测试,确保升级后的系统能够正常运行,并且之前的功能和逻辑没有受到影响。 值得注意的是,升级Struts2版本可能会引入其他的改变或者兼容性问题,因此我们需要仔细阅读相关的文档,并在升级前备份好项目和数据库,以防万一。 另外,除了升级Struts2版本之外,我们还应该保持项目的其他组件和库的更新。及时更新依赖的第三方库,修复其他潜在的漏洞,以提高整个系统的安全性。 总结起来,修复s2-016漏洞的方式是通过升级Struts2版本,升级前需要进行测试和备份,并保持项目的其他组件和库的更新。这样可以有效地提升系统的安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值