`
abccyz
  • 浏览: 16861 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2的漏洞修复

 
阅读更多
Intel® Developer Zone logo

Intel® Developer Zone

你在这里

Struts2 高危漏洞修复方案 (S2-016/S2-017)

近期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

第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解压目录
-------------------------

packagecom.htht.commonweb;

importjava.util.Map;

importognl.MethodAccessor;
importognl.MethodFailedException;
importognl.OgnlRuntime;


/**
*@authoryanjianzhong(yjz_ok@163.com)2013/08/08
*@版权所有,转载请标明出处.http://blog.csdn.net/jzshmyt
*download:http://jskfs.googlecode.com/files/struts2_(016_017)_bug_repair.rar
*/
publicclassJavaEEbugRepair{
/*
*官方描述:
*S2-016:https://cwiki.apache.org/confluence/display/WW/S2-016
*S2_016bugrepair
*/
privatestaticS2_0XXs2_016=newS2_0XX();


/*
*修改ognl.Ognl#parseExpression,调用check_s2_016方法
*publicstaticObjectparseExpression(Stringexpression)throwsOgnlException
*{
*//modifypointbegin
*if(JavaEEBug.check_s2_016(expression)){
*returnnull
*}
*//modifypointend
*try{
*OgnlParserparser=newOgnlParser(newStringReader(expression));
*returnparser.topLevelExpression();
*}catch(ParseExceptione){
*thrownewExpressionSyntaxException(expression,e);
*}catch(TokenMgrErrore){
*thrownewExpressionSyntaxException(expression,e);
*}
*}
*/
publicstaticbooleanrepair_s2_016(Stringexpression){
returns2_016.check(expression);
}
/*
*在servlet/struts/spring任何一个框架的listener中调用
*/
publicstaticvoidinitRepair_S2_016(){
OgnlRuntime.setMethodAccessor(Runtime.class,newNoMethodAccessor());
OgnlRuntime.setMethodAccessor(System.class,newNoMethodAccessor());
OgnlRuntime.setMethodAccessor(ProcessBuilder.class,newNoMethodAccessor());
OgnlRuntime.setMethodAccessor(OgnlRuntime.class,newNoMethodAccessor());

s2_016=newS2_0XX(){
publicbooleancheck(Stringexpression){
StringevalMethod[]={"Runtime","ProcessBuilder","newFile"};
StringmethodString=null;
methodString=expression.toLowerCase();
for(inti=0;i<evalMethod.length;i++){
if(methodString.indexOf(evalMethod[i].toLowerCase())>-1){
System.out.print("|OGNL正在执行恶意语句|"+methodString+"|看到这个消息,请联系安全工程师!!!");
returntrue;
}
}
returnfalse;
}
};

}

/*
*S2-017:https://cwiki.apache.org/confluence/display/WW/S2-017
*S2_017bugrepair
*/
privatestaticS2_0XXs2_017=newS2_0XX();

/*
*Callbyorg.apache.struts2.dispatcher.mapper.DefaultActionMapper#handleSpecialParameters
*RepairExample:
*publicvoidhandleSpecialParameters(HttpServletRequestrequest,ActionMappingmapping)
*{
*SetuniqueParameters=newHashSet();
*MapparameterMap=request.getParameterMap();
*Iteratoriterator=parameterMap.keySet().iterator();
*while(iterator.hasNext()){
*Stringkey=(String)iterator.next();
*
*if((key.endsWith(".x"))||(key.endsWith(".y"))){
*key=key.substring(0,key.length()-2);
*}
*//modifypointbegin
*if(JavaEEBug.check_s2_017(key)){
*return;
*}
*//modifypointend
*if(!uniqueParameters.contains(key)){
*ParameterActionparameterAction=(ParameterAction)this.prefixTrie.get(key);
*
*if(parameterAction!=null){
*parameterAction.execute(key,mapping);
*uniqueParameters.add(key);
*break;
*}
*}
*}
*}
*/
publicstaticbooleanrepair_s2_017(Stringkey){
returns2_017.check(key);
}

/*
*在servlet/struts/spring任何一个框架的listener中调用
*/
publicstaticvoidinitRepair_S2_017(){
s2_017=newS2_0XX(){
publicbooleancheck(Stringkey){
return(key.contains("redirect:"))||(key.contains("redirectAction:"))||(key.contains("action:"));
}
};
}
}

/**
*漏洞验证修复之基类
*说明:
*漏洞修复代码的实现逻辑,非侵入式设计。
*当listener中未调用initRepair_S2_016、initRepair_S2_017进行漏洞调用初始化时,
*保持Ognl和DefaultActionMapper修复前源码等价逻辑.
*
*/
classS2_0XX{
publicbooleancheck(Stringkey){
returnfalse;
}
}


classNoMethodAccessorimplementsMethodAccessor{
publicNoMethodAccessor(){
}

@Override
publicObjectcallStaticMethod(Mapcontext,ClasstargetClass,
StringmethodName,Object[]args)throwsMethodFailedException{
thrownewMethodFailedException("donotrun",methodName,null);
}

@Override
publicObjectcallMethod(Mapcontext,Objecttarget,StringmethodName,
Object[]args)throwsMethodFailedException{
//TODOAuto-generatedmethodstub
thrownewMethodFailedException("donotrun",methodName,null);
}
}
附件 尺寸
下载struts2-016-017-bug-repair.zip 8.22 KB
如需更全面地了解编译器优化,请参阅优化注意事项
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics