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
wps_clip_image-261
找到:
<interceptor
name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
将它注释掉,该为:
<interceptor name="params" class="com.YourCompany.filter.YourParametersInterceptor"/>
然后保存,增加一个你定义的参数拦截器,就搞定
我项目的包,经测试,该项目中没有发现此漏洞,没有使用属性驱动和OGNL表达式。
wps_clip_image-524
2、官方给出的补丁:
同样,在这个类中:
修改了:
    @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) =&gt; [ true ] (aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew java.lang.Boolean("false"))) =&gt; [  ] (asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime())) =&gt; [ 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\u003d@java.lang.Runtime@getRuntime()))=1
 
目前问题解决
从svn下载,获得最新xwork-core-2.1.6
反编译,其实他就修改了正则。