Struts2漏洞修复方案

近期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。(被墙了)

     http://files.cnblogs.com/MarkMai/struts2-016-017-bug-repair.zip

第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([email protected]) 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); 
    } 
}

时间: 2024-10-11 05:10:04

Struts2漏洞修复方案的相关文章

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

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

网站安全之逻辑漏洞检测 附网站漏洞修复方案

在网站安全的日常安全检测当中,我们SINE安全公司发现网站的逻辑漏洞占比也是很高的,前段时间某酒店网站被爆出存在高危的逻辑漏洞,该漏洞导致酒店的几亿客户的信息遭泄露,包括手机号,姓名,地址都被泄露,后续带来的损失很大,最近几年用户信息泄露的事件时有发生,给很多企业,酒店都上了一堂生动的安全课.关于网站逻辑漏洞的总结,今天跟大家详细讲解一下.网站逻辑漏洞 用户的隐私信息属于数据的保护的最高级别,也是最重要的一部分数据,在逻辑漏洞当中属于敏感信息泄露,有些敏感信息还包括了系统的重要信息,比如服务器的

网站安全之逻辑漏洞检测 附漏洞修复方案

在网站安全的日常安全检测当中,我们SINE安全公司发现网站的逻辑漏洞占比也是很高的,前段时间某酒店网站被爆出存在高危的逻辑漏洞,该漏洞导致酒店的几亿客户的信息遭泄露,包括手机号,姓名,地址都被泄露,后续带来的损失很大,最近几年用户信息泄露的事件时有发生,给很多企业,酒店都上了一堂生动的安全课.关于网站逻辑漏洞的总结,今天跟大家详细讲解一下. 网站逻辑漏洞 用户的隐私信息属于数据的保护的最高级别,也是最重要的一部分数据,在逻辑漏洞当中属于敏感信息泄露,有些敏感信息还包括了系统的重要信息,比如服务器

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

struts2从开发出来到现在,很多互联网企业,公司,平台都在使用apache struts2系统来开发网站,以及应用系统,这几年来因为使用较多,被***者挖掘出来的struts2漏洞也越来越,从最一开始S2-001到现在的最新的s2-057漏洞,本文着重的给大家介绍一下struts2漏洞的利用详情以及漏洞修复办法. 先从1开始吧,S2-001影响的版本是Struts 2.0.0 - Struts 2.0.8版本,最早开始的版本漏洞太低级,当时的apache官方并没有设置安全机制,导致在提交参数

Linux Glibc库严重安全漏洞修复方案通知(腾讯开发者社区)

如何查看当前glibc的版本号? rpm -aq | grep glibc 尊敬的用户: 您好!2015年1月28日, 腾讯云安全情报监测到LinuxGlibc库存在一处严重安全漏洞,可以通过gethostbyname系列函数实现远程代码执行,获取服务器的控制权及Shell权限,漏洞详细点击这里查看. [影响版本]: Glibc2.2 ~ Glibc 2.18 [修复方案]:       1.通过官方渠道自助下载更新,升级到Glibc 2.19及其以上版本.官方已在Glibc 2.19及以上版本

网站漏洞修复方案防止SQL注入×××漏洞

SQL注入漏洞在网站漏洞里面属于高危漏洞,排列在前三,受影响范围较广,像asp..net.PHP.java.等程序语言编写的代码,都存在着sql注入漏洞,那么如何检测网站存在sql注入漏洞? SQL注入漏洞测试方法 在程序代码里不管是get提交,post提交,cookies的方式,都可以有随意控制参数的一个参数值,通过使用sql注入工具,经典的sqlmap进行检测与漏洞利用,也可以使用一些国内的SQL代码注入工具,最简单的安全测试方法就是利用数据库的单引号, AND 1=1 AND 1=2等等的

服务器SSL不安全漏洞修复方案

关于SSL POODLE漏洞 POODLE = Padding Oracle On Downgraded Legacy Encryption.是最新安全漏洞(CVE-2014-3566)的代号,俗称“贵宾犬”漏洞. 此漏洞是针对SSL3.0中CBC模式加密算法的一种padding oracle攻击,可以让攻击者获取SSL通信中的部分信息明文,如果将明文中的重要部分获取了,比如cookie,session,则信息的安全出现了隐患. 从本质上说,这是SSL设计上的缺陷,SSL先认证再加密是不安全的.

怎么修复网站漏洞 骑士cms的漏洞修复方案

骑士CMS是国内公司开发的一套开源人才网站系统,使用PHP语言开发以及mysql数据库的架构,2019年1月份被某安全组织检测出漏洞,目前最新版本4.2存在高危网站漏洞,通杀SQL注入漏洞,利用该网站漏洞可以获取网站的管理员账号密码以及用户账号信息. 目前很多人才网站都使用的骑士CMS系统,受影响的网站较多,关于该网站漏洞的详情我们来详细的分析一下.骑士cms4.2最新版本使用了thinkphp的架构,底层的核心基础代码都是基于thinkphp的开发代码,有些低于4.2版本的网站系统都会受到漏洞

struts2漏洞修复

struts2-core-2.1.6.jar. xwork-2.1.2.jar. freemarker-2.3.13.jar. ognl-2.6.11.jar. commons-logging-1.0.4.jar. commons-fileupload-1.2.1.jar. commons-io-1.3.2.jar