Struts2漏洞修复方案

Struts2漏洞修复方案Struts2漏洞修复方案近期Struts2被曝重要漏洞,此漏洞影响struts2.0-struts2.3所有版本,可直接导致服务器被远程控制从而引起数据泄漏,影响巨大,受影响站点以电商、银行、门户、政府居多.官方描述:S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016S2-0

大家好,又见面了,我是你们的朋友全栈君。

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(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); 
    } 
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161679.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深度信念网络(Deep Belief Network)[通俗易懂]

    深度信念网络(DeepBeliefNetwork,DBN)由GeoffreyHinton在2006年提出。它是一种生成模型,通过训练其神经元间的权重,我们可以让整个神经网络按照最大概率来生成训练数据。我们不仅可以使用DBN识别特征、分类数据,还可以用它来生成数据。DBN由多层神经元构成,这些神经元又分为显性神经元和隐性神经元(以下简称显元和隐元)。显元用于接受输入,隐…

    2022年4月12日
  • Keil系列教程(汇总)「建议收藏」

    Keil系列教程(汇总)「建议收藏」推荐分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang我的网站:https://www.strongerhuang.com我的知乎:https://www.zhihu.com/people/strongerHuang.com推荐在我公众…

    2022年5月24日
  • Mac OSX 上安装yarn

    Mac OSX 上安装yarn最近研究东西,需要yarn这个东西按照npm仓库上npmi-gyarn//直接全局安装 但Terminal上输入:yarn–version显示这个:这是因为环境变量中没有yarn,需要设置下第一步:touch~/.bash_profile//touch的意思是没有就创建;.bash_profile这是系统临时的环境变量,第二步:op…

    2022年5月26日
  • Python程序中的进程操作

    之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程

    2022年3月29日
  • xshell 在Oracle SQL Plus backspace键 变为 sele^H^H^H

    xshell 在Oracle SQL Plus backspace键 变为 sele^H^H^Hxshell在OracleSQLPlus backspace键变为sele^H^H^H问题描述:用Xshell登录进入linux后,在普通模式下或进入SQLPlus 模式下,对输入进行删除等操作没有问题.而在运行中,按delete,backspace键时会产生^H等乱码问题.这是因为编码不匹配的问题.解决方法:方法1:

    2022年11月1日
  • esp32cam远程监控(局域网的组成)

    ESP32-CAM实现局域网/远程视频传输手上这个ESP32-CAM买回来已经放了一个学期了,最近才开始玩,试了试用它来实现视频传输。局域网的视频传输比较简单,基本能正确把例程烧进去就可以了,这篇文章主要记录一下远程视频传输的实现。ESP32-CAM实现局域网/远程视频传输ESP32-CAM实现局域网/远程视频传输方法一:PlatfromIO例程+路由器内网穿透条件1.直接使用Platfr…

    2022年4月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号