ActionContext ac = invocation.getInvocationContext();
Map parameters = ac.getParameters();
事實上,随着項目應用的廣泛,參數的多樣性,這個“參數攔截器”并沒有幫助我們過慮,這個問題,應該是交給開發者,根據實際的情況來處理。
個人的辦法:
1、使用自己定義的ParametersInterceptor
修改項目中的:struts2-core-2.0.14.jar
檢視struts-default.xml
<a href="http://jooben.blog.51cto.com/attachment/201007/19/253727_1279528658PMXq.png"></a>
找到:
<interceptor
name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
将它注釋掉,該為:
<interceptor name="params" class="com.YourCompany.filter.YourParametersInterceptor"/>
然後儲存,增加一個你定義的參數攔截器,就搞定
我項目的包,經測試,該項目中沒有發現此漏洞,沒有使用屬性驅動和OGNL表達式。
<a href="http://jooben.blog.51cto.com/attachment/201007/19/253727_1279528660ZM64.png"></a>
2、官方給出的更新檔:
<a href="http://svn.apache.org/viewvc?view=revision&revision=956389">http://svn.apache.org/viewvc?view=revision&revision=956389</a>
同樣,在這個類中:
<a href="http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java?view=markup&pathrev=956389">http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java?view=markup&pathrev=956389</a>
修改了:
@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));
}
。。。。。。。。。
2010-07-19 15:59:21,203
DEBUG [com.opensymphony.xwork2.interceptor.StaticParametersInterceptor] - Setting static parameters {}
DEBUG [com.opensymphony.xwork2.interceptor.ParametersInterceptor] - Setting params NONE
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\[email protected]@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\[email protected]@getRuntime()))=1
目前問題解決
從svn下載下傳,獲得最新xwork-core-2.1.6
反編譯,其實他就修改了正則。
本文轉自jooben 51CTO部落格,原文連結:http://blog.51cto.com/jooben/352958