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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PhpStorm2017.1版激活方法、汉化方法以及界面配置「建议收藏」

    PhpStorm2017.1版激活方法、汉化方法以及界面配置「建议收藏」本教程仅对2017.1版有效!!!!!!PhpStorm激活和汉化文件下载网址(提取密码:62cg)PhpStorm的介绍PhpStorm是一个轻量级且便捷的PHPIDE,其旨在提高用户效率,

    2022年7月2日
    24
  • robotium android,Robotium 测试Android apk安装包

    robotium android,Robotium 测试Android apk安装包介绍要测试apk程序必须和我们编写的测试程序拥有相同的签名(signature)。如果没有apk程序的签名秘钥,就要去除apk程序的签名,然后再使用自己的key对其签名(这一步中,我们可以使用debugkey),已经有现成的工具可用,下载地址re-sign.jar,这个工具可以去掉apk程序的原签名,然后使用我们自己的debugkey对其签名。详细编写测试用例之前,我们需要知道apk程序的包名…

    2022年7月25日
    9
  • 3G中的TDD与FDD

    3G中的TDD与FDD在现有的3G有三大主流技术标准:WCDMA、CDMA2000和TD-SCDMA,虽然它们都属于CDMA技术,但是从它们的主要应用方面可分为两类:WCDMA、CDMA2000属于FDD标准;而TD-SCDMA属于TDD标准。另外,3.5G的HSDPA系统中兼有FDD和TDD,而4G的前驱MobileWiMAX兼有TDD、FDD、半双工FDD。国际上给WCDMA分的…

    2022年5月4日
    47
  • postfix邮箱_用post方式发送文件

    postfix邮箱_用post方式发送文件一、首先关闭防火墙[root@localhost~]#systemctlstopfirewalld[root@localhost~]#setenforce0[root@localhost~]#getenforcePermissive二、搭建postfix[root@localhost~]#yuminstallpostfix三、配置postfix[root@local…

    2022年9月23日
    0
  • 善待自己:改变命运的N个人生哲理

    善待自己:改变命运的N个人生哲理心灵的栅栏  人与月亮的距离并不遥远,因为人与人心灵间的距离更为遥远。  ——王尔德    当玛格丽特的丈夫杰瑞因脑瘤去世后,她变得异常愤怒,生活太不公平,她憎恨孤独。孀居3年,她的脸变得紧绷绷的。  一天,玛格丽特在小镇拥挤的路上开车,忽然发现一幢她喜欢的房子周围竖起一道新的栅栏。那房子已有一百多年的历史,颜色变白,有很大的门廊,过去一直隐藏在路后面。如今马路扩展,街口竖起了红绿灯,小镇已颇有些

    2022年7月12日
    10
  • golang 2021最新激活码_通用破解码[通俗易懂]

    golang 2021最新激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    58

发表回复

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

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