读书人

Struts破绽分析

发布时间: 2013-11-13 14:04:18 作者: rapoo

Struts漏洞分析
try{ newStack.setValue(name,value); } ?利用stack.setValue(“name”,”aaa”);就把name属性的值改为aaa字符串。在上述的url中,有两个至关重要的值:在map栈中:下图:? ??Struts破绽分析

<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了,像这样就行:

?

读书人网 >编程

热点推荐