struts2 最新漏洞 S2-016、S2-017修补方案 – jasonzhou

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

看下乌云这两天的数据:

相关报道:

灾难日:中国互联网惨遭Struts2高危漏洞摧残

Struts2被曝重要漏洞,波及全系版本

官方描述:

S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016
S2-017:https://cwiki.apache.org/confluence/display/WW/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

/**
* [email protected] 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;
}
}
}
}
}

 

struts.xml

<!– 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper –>
<bean type=”org.apache.struts2.dispatcher.mapper.ActionMapper” name=”myDefaultActionMapper” class=”com.website.struts2.MyDefaultActionMapper” />
<constant name=”struts.mapper.class” value=”myDefaultActionMapper” />

 本文代码有参考如下网址:http://www.inbreak.net/archives/507

本文链接:http://www.cnblogs.com/chinahnzhou/p/struts2_bug_s2-016_s2-017_solution.html,转载请注明。



You must enable javascript to see captcha here!

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress

无觅相关文章插件,快速提升流量