Struts2.0.6升级Struts2.3.16.1
1.升级原因
在2013年6月底发布的Struts 2.3.15版本被曝出存在重要的安全漏洞,主要问题如下:
1)可远程执行服务器脚本代码
用户可以构造http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}链接,command goes here可以换成是破坏脚本的路径和参数,比如fdisk -f等,造成破环系统无法运行的目的。
2)重定向漏洞
用户可以构造如知名网站淘宝的重定向连接,形如http://www.hostname.com/test.html?redirect:http://hacker.com/getyourPassword,引导用户点击后进入钓鱼网站,在界面上让其进行登陆用以获取用户的密码。
2.解决办法
笔者试过两种升级方案,第一种是在不替换原有的struts包的情况下,通过代码来进行升级,但是这种升级方案效果并不理想,这只能修复重定向漏洞,并不能修复第一个漏洞,是一种轻量级的伪升级。
第二种升级方案是升级struts2的jar包,本文也主要讲的也就是这种升级方案。(ps:本文写的从Struts2.0.6或者升级到Struts2.3.16.1的过程,其他更高版本的Struts可能会更加简单,只是单纯的替换一下jar包并修改一下配置文件就可以了)
1)升级需要的jar包
struts2.3.16.1的jar包,下载地址
2)升级过程
(1)新增下列的包
struts2-core-2.3.15.2.jar
struts2-spring-plugin-2.3.15.2.jar
struts2-json-plugin-2.3.15.2.jar
xwork-core-2.3.15.2.jar
ognl-3.0.6.jar
javassist-3.11.0.GA
commons-lang3-3.1.jar
把以前的跟上面的包同名的jar包删除
(2)修改web.xml文件
找到
|
|
明显这是一个过时的语法,把它改为
|
|
若有
|
|
这也是一个过时的用法,把它改为
|
|
(3)修改各个配置文件
a.把配置文件中的:
|
|
修改为
|
|
b.把validation配置文件中的:
|
|
修改为
|
|
(4)修改其他文件
把一些过时的类名改为现在的
(5)其他
在升级后,可能引起以前的一些用法不兼容,如从struts2.0.11以后,Struts2的标签库就不在支持EL表达式了,这种情况下就需要把所有的在Struts2标签中EL表达式改为OGNL表达式。