- 一、切换jar包更改配置
- 二、页面标签修改
- 三、异常原因分析
漏洞描述
Apache struts2部分版本存在漏洞,对不受信任的用户输入使用强制OGNL可能导致远程代码执行,黑客可利用该漏洞控制服务器。一、切换jar包更改配置
切换jar包:
struts2-core-2.5.30.jar struts2-spring-plugin-2.5.30.jar 删除 xwork-2.0.4 这个包已经包含在了struts2-core-2.5.30.jar中 commons-fileupload-1.4.jar commons-io-2.6.jar
修改web.xml配置
struts2 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
启动报错:java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
引入jar包:log4j-api-2.12.4.jar
启动报错:java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
引入jar包:commons-lang3-3.8.1.jar
启动报错:java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z
升级jar包:ognl-2.6.11.jar ---> ognl-3.1.29.jar
启动报错:java.lang.NoClassDefFoundError: freemarker/template/Version
升级jar包:freemarker-2.3.10.jar ---> freemarker-2.3.31.jar
访问主页面报错,时而好使时而不好使
ERROR DefaultDispatcherErrorHandler Exception occurred during processing request: null java.lang.NullPointerException at com.opensymphony.xwork2.validator.DelegatingValidatorContext.makeTextProvider(DelegatingValidatorContext.java:212) at com.opensymphony.xwork2.validator.DelegatingValidatorContext.(DelegatingValidatorContext.java:65) at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.validate(AnnotationActionValidatorManager.java:127) at com.opensymphony.xwork2.validator.AnnotationActionValidatorManager.validate(AnnotationActionValidatorManager.java:123) at com.opensymphony.xwork2.validator.ValidationInterceptor.doBeforeInvocation(ValidationInterceptor.java:227)
---改为---> 如果还不好使,检查validator配置的自定义类中是否引入了某些已被删除的包
改为: regex:.* /pages/xxx/xxx.jsp
如果页面访问有问题可以尝试进行下面修改
引入jar包:javassist-3.20.0-GA.jar
struts2
/struts
Document doc = DomHelper.parse(in, dtdMappings);
if (doc != null) {
NodeList nodes = doc.getElementsByTagName("validator");
for (int i = 0; i < nodes.getLength(); i++) {
Element validatorElement = (Element) nodes.item(i);
String name = validatorElement.getAttribute("name");
String className = validatorElement.getAttribute("class");
try {
// catch any problems here
objectFactory.buildValidator(className, new HashMap(), ActionContext.getContext().getContextMap());
validators.put(name, className);
} catch (Exception e) {
throw new ConfigurationException("Unable to load validator class " + className, e, validatorElement);
}
}
}
}
...
}
-
这个方法中加载了两个配置文件com/opensymphony/xwork2/validator/validators/default.xml和validators.xml
第一个文件是jar包中自己的配置文件,没问题
第二个文件就比较坑了,他在系统的resources目录下查找文件,找到则加载
因为我的文件是老版本的配置文件,因此在Document doc = DomHelper.parse(in, dtdMappings);这一步格式化时,格式化报错了,这个时候抛出一个有意思的异常java.net.ConnectException: Connection timed out: connect
接着一路上抛,在这个位置打印了一个LOG.warn, 而我的后台风平浪静。。。。
public class InterceptorBuilder { ... public static ListconstructInterceptorReference(InterceptorLocator interceptorLocator, String refName, Map refParams, Location location, ObjectFactory objectFactory) throws ConfigurationException { ... if (referencedConfig instanceof InterceptorConfig) { InterceptorConfig config = (InterceptorConfig) referencedConfig; Interceptor inter; try { inter = objectFactory.buildInterceptor(config, refParams); result.add(new InterceptorMapping(refName, inter, refParams)); } catch (ConfigurationException ex) { LOG.warn(new ParameterizedMessage("Unable to load config class {} at {} probably due to a missing jar, which might be fine if you never plan to use the {} interceptor", config.getClassName(), ex.getLocation(), config.getName()), ex); } } ... } ... } -
struts2-core-2.5.30版本依赖了log4j-api-2.12.4, 这与老版本的log4j-1.2.13貌似不兼容,引入log4j-core-2.12.4.jar是否会打印,有待验证,log4j-core在2.16版本前的都有漏洞,暂时不处理
-
对比com/opensymphony/xwork2/validator/validators/default.xml和validators.xml两个文件发现头部标签不一致,修改后加载正常
-
如果还不好使,检查validator配置的自定义类中是否引入了某些已被删除的包



