近期Struts2被曝重要漏洞,此漏洞影响struts2.0-struts2.3所有版本,可直接导致服务器被远程控制从而引起数据泄漏,影响巨大,受影响站点以电商、银行、门户、政府居多.

官方描述:
S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016
S2-017:https://cwiki.apache.org/confluence/display/WW/S2-017

官方建议修复方案:升级到最新版本 struts-2.3.15.1

但通常现有系统升级,可能导致不稳定及与其他框架比如spring等的不兼容,成本较高。
鉴于此本人整理了一种既可以不用升级现有struts版本,有能完美解决这两个漏洞的方案,

分享如下:

-------------------------

第1步.下载http://jskfs.googlecode.com/files/struts2_(016_017)_bug_repair.rar

第2步.解压,将src目录中的所有文件,复制到自己项目的src目录中,编译通过
  (本例struts是2.0.9版本,实际项目需要根据struts版本做适当调整).
  应用服务器会优先加载class目录中的类,自动覆盖jar包中的类.
  
第3步.web.xml中配置com.htht.commonweb.listener.MyServletContextListener

 <listener> 
  <listener-class>org.hdht.commonweb.listener.MyServletContextListener</listener-class> 
 </listener>

第4步.重启服务,修复完毕.

@版权所有,转载请标明出处. http://blog.csdn.net/jzshmyt

附:JavaEEbugRepair.java,完整包参见struts2_(016_017)_bug_repair.rar解压目录
-------------------------

package com.htht.commonweb;

import java.util.Map;

import ognl.MethodAccessor; 
import ognl.MethodFailedException; 
import ognl.OgnlRuntime;

/** 
 * @author yanjianzhong(yjz_ok@163.com) 2013/08/08 
 * @版权所有,转载请标明出处. http://blog.csdn.net/jzshmyt 
 * download : http://jskfs.googlecode.com/files/struts2_(016_017)_bug_repair.rar 
 */ 
public class JavaEEbugRepair{ 
    /* 
     * 官方描述: 
     * S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016 
     * S2_016 bug repair 
     */ 
    private static S2_0XX s2_016 = new S2_0XX();

/* 
     *  修改 ognl.Ognl#parseExpression,调用 check_s2_016 方法 
     *  public static Object parseExpression(String expression)throws OgnlException 
     *    { 
     *          //modify point begin 
     *          if(JavaEEBug.check_s2_016(expression)){  
     *                return null  
     *          } 
     *          //modify point end 
     *          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); 
     *          } 
     *      } 
     */ 
    public static boolean repair_s2_016(String expression){ 
        return s2_016.check(expression); 
    } 
    /* 
    * 在servlet/struts/spring 任何一个框架的listener中调用 
    */ 
    public static void initRepair_S2_016(){ 
        OgnlRuntime.setMethodAccessor(Runtime.class, new NoMethodAccessor()); 
        OgnlRuntime.setMethodAccessor(System.class, new NoMethodAccessor()); 
        OgnlRuntime.setMethodAccessor(ProcessBuilder.class,new NoMethodAccessor()); 
        OgnlRuntime.setMethodAccessor(OgnlRuntime.class, new NoMethodAccessor()); 
         
        s2_016 = new S2_0XX(){ 
            public boolean check(String expression){ 
                String evalMethod[] = {"Runtime", "ProcessBuilder","new File" }; 
                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 true; 
                    } 
                } 
                return false; 
            } 
        }; 
         
    } 
     
    /* 
     * S2-017:https://cwiki.apache.org/confluence/display/WW/S2-017 
     * S2_017 bug repair 
     */ 
    private static S2_0XX s2_017 = new S2_0XX(); 
     
    /* 
    * Call by org.apache.struts2.dispatcher.mapper.DefaultActionMapper#handleSpecialParameters  
    * Repair Example : 
    * public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) 
    * { 
    *        Set uniqueParameters = new HashSet(); 
    *        Map parameterMap = request.getParameterMap(); 
    *        Iterator iterator = parameterMap.keySet().iterator(); 
    *        while (iterator.hasNext()) { 
    *          String key = (String)iterator.next(); 
    *     
    *          if ((key.endsWith(".x")) || (key.endsWith(".y"))) { 
    *            key = key.substring(0, key.length() - 2); 
    *          } 
    *          //modify point begin 
    *          if (JavaEEBug.check_s2_017(key)) { 
    *              return; 
    *          } 
    *          //modify point end 
    *          if (!uniqueParameters.contains(key)) { 
    *            ParameterAction parameterAction = (ParameterAction)this.prefixTrie.get(key); 
    *     
    *            if (parameterAction != null) { 
    *              parameterAction.execute(key, mapping); 
    *              uniqueParameters.add(key); 
    *              break; 
    *            } 
    *          } 
    *        } 
    *      } 
    */ 
    public static boolean repair_s2_017(String key){ 
        return s2_017.check(key); 
    } 
     
    /* 
    * 在servlet/struts/spring 任何一个框架的listener中调用 
    */ 
    public static void initRepair_S2_017(){ 
        s2_017 = new S2_0XX(){ 
            public boolean check(String key){ 
                return (key.contains("redirect:")) || (key.contains("redirectAction:")) || (key.contains("action:")); 
            } 
        }; 
    } 
}

/** 
 *  漏洞验证修复之基类 
 *  说明: 
 *  漏洞修复代码的实现逻辑,非侵入式设计。 
 *  当listener中未调用initRepair_S2_016、initRepair_S2_017进行漏洞调用初始化时, 
 *  保持Ognl和DefaultActionMapper修复前源码等价逻辑. 
 *  
 */ 
class S2_0XX { 
    public boolean check(String key){ 
        return false; 
    } 
}

class NoMethodAccessor implements MethodAccessor { 
    public NoMethodAccessor() { 
    }

@Override 
    public Object callStaticMethod(Map context, Class targetClass, 
            String methodName, Object[] args) throws MethodFailedException { 
        throw new MethodFailedException("do not run", methodName, null); 
    }

@Override 
    public Object callMethod(Map context, Object target, String methodName, 
            Object[] args) throws MethodFailedException { 
        // TODO Auto-generated method stub 
        throw new MethodFailedException("do not run", methodName,null); 
    } 
}

 
附件下载:

Struts2 高危漏洞修复方案 (S2-016/S2-017)的更多相关文章

  1. ThinkPHP 小于5.0.24 远程代码执行高危漏洞 修复方案

    漏洞描述由于ThinkPHP5.0框架对Request类的method处理存在缺陷,导致黑客构造特定的请求,可直接GetWebShell. 漏洞评级严重 影响版本ThinkPHP 5.0系列 < ...

  2. 应用安全-Web安全-漏洞修复方案整理

    通过HTTP头部字段防御措施整理 X-Frame-Options #反劫持 X-XSS-Protection #开启浏览器防XSS功能 Set X-Frame-Options  CSP X-Conte ...

  3. URL存在http host头攻击漏洞-修复方案

    URL存在http host头攻击漏洞-修复方案 spring boot使用注解的方式 -- 第一步:在自定义filter类上添加如下注释 package com.cmcc.hy.mobile.con ...

  4. 【渗透测试】NSA Windows 0day漏洞+修复方案

    这个漏洞是前段时间爆出来的,几乎影响了全球70%的电脑,不少高校.政府和企业都还在用Windows服务器,这次时间的影响力堪称网络大地震. ------------------------------ ...

  5. struts2架构网站漏洞修复详情与利用漏洞修复方案

    struts2从开发出来到现在,很多互联网企业,公司,平台都在使用apache struts2系统来开发网站,以及应用系统,这几年来因为使用较多,被攻击者挖掘出来的struts2漏洞也越来越,从最一开 ...

  6. 网站sql注入漏洞修复方案之metinfo 6.1.0系列

    近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...

  7. Struts2 高危漏洞补丁版本为: Struts 2.3.15.1

    Struts2 昨天爆出高危漏洞,黑客利用这个漏洞可以执行任意命令(包括恶意的jsp代码),轻松绕过您的验证系统,登陆您的网站后台,使您的网站后台密码形同虚设!! 目前Struts2官方已经发布了一个 ...

  8. DEDECMS 漏洞修复方案

    目录 DEDECMS支付模块注入漏洞 漏洞文件: /include/payment/alipay.php 漏洞描述: 对输入参数$_GET['out_trade_no']未进行严格过滤 修复方案: 对 ...

  9. Apache Struts2高危漏洞(S2-057CVE-2018-11776)

    花了两天时间,特此记录 一:背景: 2018年8月22日,Apache Strust2发布最新安全公告,Apache Struts2存在远程代码执行的高危漏洞. 二:漏洞产生原理: 1.需要知道对应跳 ...

随机推荐

  1. ReactJS -- 初学入门

    <!DOCTYPE html> <html> <head> <script src="build/react.js"></sc ...

  2. PCA和白化练习之处理二维数据

    在很多情况下,我们要处理的数据的维度很高,需要提取主要的特征进行分析这就是PCA(主成分分析),白化是为了减少各个特征之间的冗余,因为在许多自然数据中,各个特征之间往往存在着一种关联,为了减少特征之间 ...

  3. 【工具】用命令行与Python使用YARA规则

    1.前言 YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具,使用YARA可以基于文本或二进制模式创建恶意软件家族描述与匹配信息.现在已经被多家公司所运用于自身的产品. 2.YAR ...

  4. MVC常用特性使用

    简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将继续介绍一些在开发中非常 ...

  5. Binary Representation

    Given a (decimal - e.g. 3.72) number that is passed in as a string, return the binary representation ...

  6. Mini Twitter

    Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...

  7. C# XML 文档注释

    原文链接:http://www.shinater.com/DocsBuilder/help.html <summary>description</summary> 描述类型或类 ...

  8. 001_fpm打包命令详解

    使用fpm来制作rpm包 2017/2/22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...

  9. 关于阿里云和ucloud云服务器负载均衡器slb和ulb会话保持的配置

    在阿里云slb或者ucloud的ulb上对公司网站后台做了负载均衡以后,发现经常需要重新登录,单独访问没有这样的问题,问题就出在session的保持上,在云控制台中有配置会话的相关选项 阿里云的配置 ...

  10. java 异常使用指南

    应该在以下情况使用异常: 1.)在恰当的级别处理问题.(在知道如何处理的情况下才捕获异常) 2.)解决问题并且重新调用异常的方法 3.)进行少许的修补,然后绕过异常发生的地方继续执行 4.)用别的数据 ...