近期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-class>org.hdht.commonweb.listener.MyServletContextListener</listener-class>
</listener>
第4步.重启服务,修复完毕.
@版权所有,转载请标明出处.http://blog.csdn.net/jzshmyt
附:JavaEEbugRepair.java,完整包参见struts2_(016_017)_bug_repair.rar解压目录
-------------------------
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);
}
}
相关推荐
该漏洞影响范围(Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10),漏洞危害程度严重,可造成直接获取应用系统所在服务器的控制权限 文件包含ognl-3.0.21.jar,struts2-convention-plugin-2.3.34.jar,...
关于解决 Apache_Struts2漏洞(S2-045,CVE-2017-5638),包含说明与所需资源
Struts2_045漏洞修复jar包和检测工具 freemarker-2.3.22.jar ognl-3.0.21.jar struts2-core-2.3.34.jar xwork-core-2.3.34.jar struts2-json-plugin-2.3.34.jar struts2-junit-plugin-2.3.34.jar struts2-spring-...
struts2 最新漏洞 S2-016、S2-017修补方案 .docx
因为最近攻防演练,对公司的资产进行梳理,发现部分应用还使用的struts1框架,所以赶快收集整理了相关的漏洞以及相关的整改方案。提供给大家。
0、这是一个简单、暴力、治根的补漏方法 1、struts2漏洞s2-045,不升级jar版本的修补方法,已验证
ssh1.3.15.1-struts最新高危漏洞修复版ssh整合jar包。解压后直接buildPath.
spring struts2 lib包已整合最新的struts2漏洞补丁包
Struts2漏洞(struts2-032,struts2-045)2016年引发的银行大动作及修复办法
-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...
针对3.7号 struts新漏洞的新包修复
NULL 博文链接:https://eddysoft.iteye.com/blog/1911561
2.如果您使用基于Jakarta插件,请升级到Apache Struts 2.3.32或2.5.10.1版本。(强烈推荐) 3.升级到2.3.32所用到的jar包: freemarker-2.3.22.jar ognl-3.0.19.jar struts2-convention-plugin-2.3.32.jar struts2-...
struts2-convention-plugin-2.3.32.jar struts2-core-2.3.32.jar struts2-spring-plugin-2.3.32.jar xwork-core-2.3.32.jar 2、删除上面原有的低版本jar 3、修改 WEB-INF\classes 目录下struts.xml 文件,...
struts2漏洞利用工具V1.41 请遵守网络安全法,该工具仅用于研究学习和网络管理员安全检测,不要用于任何非法用途,工具使用造成的后果与本人无关 新版开发计划:1、执行任意jar包2、学习模式提交,可修改任意参数 ...
Struts2 安全漏洞解析,距离上个版本发布仅仅过去1周,apache struts官网又发布struts2最新版本安全公告,主要修复了一个漏洞,代号S2-022:从漏洞简要描述来看,确定是对之前S2-021的补充。
struts2核心jar包(漏洞已经修复)
给还用struts2框架的系统提供一个完美的解决方案,里面的struts2版本jar都统一好,大家在用的时候直接将对应的jar先删除,然后用这里面的jar包。必免jar冲突了
Struts2 安全漏洞解析,距离上个版本发布仅仅过去1周,apache struts官网又发布struts2最新版本安全公告,主要修复了一个漏洞,代号S2-022:从漏洞简要描述来看,确定是对之前S2-021的补充