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`]u003du0023foo`)(u0023foou003dnew java.lang.Boolean(“false”))) =&gt; [  ] (asdf)((`u0023rt.exit(1)`)(u0023rtu003d@java.lang.Runtime@getRuntime())) =&gt; [ 1 ]
exit(1),強迫伺服器正常退出了,這個讓我很吃驚!
 
就是這段引數:
(`u0023_memberAccess[`allowStaticMethodAccess`]`)(meh)=true&(aaa)((`u0023context[`xwork.MethodAccessor.denyMethodExecution`]u003du0023foo`)(u0023foou003dnew%20java.lang.Boolean(“false”)))&(asdf)((`u0023rt.exit(1)`)(u0023rtu003d@java.lang.Runtime@getRuntime()))=1
 
目前問題解決
從svn下載,獲得最新xwork-core-2.1.6
反編譯,其實他就修改了正則。