Struts2升级

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文件
找到

1
2
3
4
5
6
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

明显这是一个过时的语法,把它改为

1
2
3
4
5
<filter>
<filter-name>struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>

若有

1
2
3
4
5
6
<filter>
<filter-name>struts2Cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>

这也是一个过时的用法,把它改为

1
2
3
4
5
6
<filter>
<filter-name>struts2Cleanup/filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>

(3)修改各个配置文件
a.把配置文件中的:

1
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

修改为

1
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">

b.把validation配置文件中的:

1
2
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">

修改为

1
2
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

(4)修改其他文件
把一些过时的类名改为现在的

(5)其他
在升级后,可能引起以前的一些用法不兼容,如从struts2.0.11以后,Struts2的标签库就不在支持EL表达式了,这种情况下就需要把所有的在Struts2标签中EL表达式改为OGNL表达式。

END