`
super_521
  • 浏览: 49546 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    Struts2 (S2-016/S2-017)高危漏洞修复文件

    Struts2 (S2-016/S2-017)高危漏洞修复文件

    struts-2.3.24-apps.zip包测试Struts2 S2-048高危漏洞

    2017年7月7日,Apache Struts发布最新的安全公告,Apache Struts2-strus1-plugin插件存在远程代码执行的高危漏洞,漏洞编号为CVE-2017-9791(S2-048),主要受影响的Struts版本为:2.3.x。 攻击者可以构造恶意的字段值...

    Struts2-Scan:Struts2全漏洞扫描利用工具

    Struts2-ScanStruts2漏洞利用扫描工具,基于互联网上已经公开的Structs2高危漏洞exp的扫描利用工具,目前支持的漏洞如下: S2-001, S2-003, S2-005, S2-007, S2-008, S2-009, S2-012, S2-013, S2-015, S2-016, S2-019...

    s2-045漏洞补丁struts-2.3.32最新免费版

    目前Struts2官方已经确认漏洞(漏洞编号S2-045,CVE编号:cve-2017-5638),并定级为高危风险。 这里提供了s2-045漏洞补丁 struts-2.3.32,大家可以试试! 该漏洞影响范围极广,影响国内外绝大多数使用Struts2开发...

    S2-045 struts2-core-2.3.32.jar 相关jar包,测试可用

    目前Struts2官方已经确认漏洞(漏洞编号S2-045,CVE编号:cve-2017-5638),并定级为高危风险。 该漏洞的影响范围:Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10。 修复方式:更新至Struts 2.3.32...

    关于Apache Struts 2软件存在高危漏洞的紧急通报003

    关于Apache Struts 2软件存在高危漏洞的紧急通报003

    CVE-2017-9805-POC.py s2-052.py 批量检测脚本

    Apache Struts2的REST插件存在远程代码执行的高危漏洞,其编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行...

    struts 2 升级所需jar 包集合(升级到2.3.32)

    最近,Struts2接连曝出高危漏洞S2-045、S2-046

    毕业设计企业网站源码-s2-052-reproducing:s2-052-再现

    Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。 Github项目地址: 0x01 漏洞影响 启用Struts REST插件并使用XStream组件对XML进行反序列操作...

    Struts 2.5.10.1(Struts 2.3.32)

    struts-2.5.10.1和struts-2.3.32 官方发布最新版本 lib包,官方发布最新版本 lib包,可预防高危漏洞Apache struts2 S2-045远程代码执行漏洞(CNVD-2017-02474,对应CVE-2017-5638)风险预警

    struts-2.3.32

    漏洞编号:S2-045 CVE编号:CVE-2017-5638 漏洞类型:远程代码执行 漏洞级别:高危 漏洞风险:黑客通过利用漏洞可以实现远程命令执行。 影响版本:struts2.3.5– struts2.3.31 , struts2.5–struts2.5.10。 本...

    Struts2 2.3.32

    压缩包是 struts2 的2.3.32 版本以及依赖

Global site tag (gtag.js) - Google Analytics