Struts漏洞分析
try{ newStack.setValue(name,value); } ?利用stack.setValue(“name”,”aaa”);就把name属性的值改为aaa字符串。在上述的url中,有两个至关重要的值:在map栈中:下图:? ??
<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>
?_memberAccess是OgnlContext中的一个属性,这是一个权限类SecurityMemberAccess,该权限类中有一个方法allowStaticMethodAccess:是否允许访问静态方法。通过上面的url,把该属性的值设置为了true(默认值为false),
?
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);,执行完毕后,使得我们的整个程序停掉了。
???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了,像这样就行:
?
