Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206162
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1259
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-24 10:20
文章分类
文章存档

2014年(21)

2013年(26)

分类: 网络与安全

2013-07-25 09:55:05

 昨天struts2爆了一个好大的漏洞,用道哥的话来说就是:“今天下午整个中国的黑客圈像疯了一样开始利用这个漏洞黑网站,大家可以感受一下。”
看下乌云这两天的数据:

相关报道:
灾难日:中国互联网惨遭Struts2高危漏洞摧残
Struts2被曝重要漏洞,波及全系版本
官方描述:
S2-016:
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();     for (int 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;
阅读(1277) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~