OK,问题找到了,其实这个问题,在2008年有类似描述: http://www.hacker.cn/News/ldgg/2008-11-7/08117107B0EE.shtml
ActionContext ac = invocation.getInvocationContext();
Map parameters = ac.getParameters();
事实上,随着项目应用的广泛,参数的多样性,这个“参数拦截器”并没有帮助我们过虑,这个问题,应该是交给开发者,根据实际的情况来处理。
个人的办法:
1、使用自己定义的ParametersInterceptor
修改项目中的:struts2-core-2.0.14.jar
查看struts-default.xml
找到:
<interceptor
name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
将它注释掉,该为:
<interceptor name="params" class="com.YourCompany.filter.YourParametersInterceptor"/>
然后保存,增加一个你定义的参数拦截器,就搞定
我项目的包,经测试,该项目中没有发现此漏洞,没有使用属性驱动和OGNL表达式。
2、官方给出的补丁:
http://svn.apache.org/viewvc?view=revision&revision=956389
同样,在这个类中:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java?view=markup&pathrev=956389
修改了:
@Override
public String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (!(action instanceof NoParameters)) {
ActionContext ac = invocation.getInvocationContext();
final Map<String, Object> parameters = retrieveParameters(ac);
if (LOG.isDebugEnabled()) {
LOG.debug("Setting params " + getParameterLogMap(parameters));
}
。。。。。。。。。
刚刚测试了一下换成最新版本的jar包, http://struts.apache.org/download.cgi#struts2181问题出现了,估计官方还没有打补丁!
2010-07-19 15:59:21,203
DEBUG [com.opensymphony.xwork2.interceptor.StaticParametersInterceptor] - Setting static parameters {}
2010-07-19 15:59:21,203
DEBUG [com.opensymphony.xwork2.interceptor.ParametersInterceptor] - Setting params NONE
2010-07-19 15:59:21,203
DEBUG [com.opensymphony.xwork2.interceptor.ParametersInterceptor] - Setting params ('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh) => [ true ] (aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew java.lang.Boolean("false"))) => [ ] (asdf)(('\u0023rt.exit(1)')(\u0023rt\
[email protected]@getRuntime())) => [ 1 ]
exit(1),强迫服务器正常退出了,这个让我很吃惊!
就是这段参数:
('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\
[email protected]@getRuntime()))=1
目前问题解决
从svn下载,获得最新xwork-core-2.1.6
反编译,其实他就修改了正则。