struts2 2.3.32补丁升级后出现问题(无法注入变量问题)
来源:互联网 发布:高中免费听课软件 编辑:程序博客网 时间:2024/04/26 21:56
版权声明:本文为博主原创文章,未经博主允许不得转载。
Struts2存在远程代码执行的严重漏洞,需要把Struts2的版本升级到2.3.32后,出现部分问题。
漏洞描述:
- 漏洞编号:S2-045,CVE-2017-5638
- 漏洞名称:基于Jakarta plugin插件的Struts远程代码执行漏洞
- 官方评级:高危
当把ognl-3.0.6的jar包升级ognl-3.0.19时,会出现部分变量(变量名称为单个小写字母开头紧跟大写字母的变量)无法注入问题,即变量对应的set和get方法无法找到。
经查源码发现,在ognl包中,类OgnlRuntime.java对其方法getDeclaredMethods做了部分修改,修改代码如下:
其中capitalizeBeanPropertyName方法的代码实现如下:
private static String capitalizeBeanPropertyName(String propertyName) {
if (propertyName.length() == 1) {
return propertyName.toUpperCase();
}
// don't capitalize getters/setters
if (propertyName.startsWith(GET_PREFIX) && propertyName.endsWith("()")) {
if (Character.isUpperCase(propertyName.substring(3,4).charAt(0))) {
return propertyName;
}
}
if (propertyName.startsWith(SET_PREFIX) && propertyName.endsWith(")")) {
if (Character.isUpperCase(propertyName.substring(3,4).charAt(0))) {
return propertyName;
}
}
if (propertyName.startsWith(IS_PREFIX) && propertyName.endsWith("()")) {
if (Character.isUpperCase(propertyName.substring(2,3).charAt(0))) {
return propertyName;
}
}
char first = propertyName.charAt(0);
char second = propertyName.charAt(1);
if (Character.isLowerCase(first) && Character.isUpperCase(second)) {
return propertyName;
} else {
char[] chars = propertyName.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
return new String(chars);
}
}
而原先ognl-3.0.6包下的实现为
String baseName = Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1);
可以发现无法注入问题由于capitalizeBeanPropertyName方法对变量名称为单个小写字母开头紧跟大写字母的变量没有做首字母转换为大写引起。
修复此问题,有两种方法。
第一种方法:可以将capitalizeBeanPropertyName方法进行修改,修改后的代码如下:
private static String capitalizeBeanPropertyName(String propertyName) {
if (propertyName.length() == 1) {
return propertyName.toUpperCase();
}
// don't capitalize getters/setters
if (propertyName.startsWith(GET_PREFIX) && propertyName.endsWith("()")) {
if (Character.isUpperCase(propertyName.substring(3,4).charAt(0))) {
return propertyName;
}
}
if (propertyName.startsWith(SET_PREFIX) && propertyName.endsWith(")")) {
if (Character.isUpperCase(propertyName.substring(3,4).charAt(0))) {
return propertyName;
}
}
if (propertyName.startsWith(IS_PREFIX) && propertyName.endsWith("()")) {
if (Character.isUpperCase(propertyName.substring(2,3).charAt(0))) {
return propertyName;
}
}
// char first = propertyName.charAt(0);
// char second = propertyName.charAt(1);
// if (Character.isLowerCase(first) && Character.isUpperCase(second)) {
// return propertyName;
// } else {
char[] chars = propertyName.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
return new String(chars);
// }
}
第二种方法:修改变量名称为java标准规范写法,特别注意不要使用单个小写字母开头紧跟大写字母的变量,对应的set和get方法都得跟着改变。
另附ognl-3.0.6和ognl-3.0.19以及修改后的类OgnlRuntime.java的资源路径:
http://download.csdn.net/detail/poison_rose/9878695
- struts2 2.3.32补丁升级后出现问题(无法注入变量问题)
- struts2.3整合spring3.2出现无法注入的问题
- struts2升级后无法创建对象访问问题
- 解决XP操作系统系统升级(补丁更新)后出现的文件夹无法删除的问题(support、update)
- struts2.1升级到2.3后动态调用方法问题
- Struts2.0升级到2.3出现的一些问题
- oracle10g升级补丁后无法启动实例
- Mac升级yosemite后无法登陆问题
- 升级Xcode7后Pod无法使用问题
- xcode5升级到6后出现问题
- Qt升级后出现的问题
- Xcode7 ios9 升级后出现的问题
- 升级python后,iotop出现的问题
- 升级xcode9后出现的一些问题
- 升级php7后,phpmyadmin出现问题处理
- Spring+struts2碰到无法注入属性的问题.
- 解决Spring注解无法注入静态变量的问题
- 解决 struts2 升级后 找不到result的问题
- Synchronized与ReentrantLock区别
- Spring主要标签
- JQUERY Unit01: jQuery概述 、 jQuery选择器 、 jQuery操作DOM
- FTP文件读取以及删除(问题:xml报错、第二次读取inputstream is null等等问题)
- imgproc模块--多边形测试
- struts2 2.3.32补丁升级后出现问题(无法注入变量问题)
- css按钮样式!很漂亮!
- Angular.js中使用Swiper插件不能滑动的解决方案
- java
- 关于ng-file-upload插件反应慢的问题
- 1、Kafka简介
- 147. Insertion Sort List
- svg转成字体
- 使用unity的mesh绘制三菱柱的碰撞体(3d三角形)