struts2 新漏洞 S2-016、S2-017修补规划

    添加时间:2013-7-18 点击量:

    昨天struts2爆了一个好大的漏洞,用道哥的话来说就是:“今全国午全部中国的黑客圈像疯了一样开端哄骗这个漏洞黑网站,大师可以感触感染一下。”


    看下乌云这两天的数据:



    相干报道:


    灾害日:中国互联网惨遭Struts2高危漏洞摧残


    Struts2被曝首要漏洞,波及全系版本


    官方描述:


    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();
    forint 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 />


     本文代码有参考如下网址:http://www.inbreak.net/archives/507

    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: