当前位置:首页Struts2漏洞频出 或因Apache底层代码编写不严 举报文章

Struts2漏洞频出 或因Apache底层代码编写不严

作者:admin    来源:用户投稿    时间:2015.6.11   

  日前,Struts2再次爆出安全漏洞,主要影响国内电商、银行、运营商等诸多大型网站和为数众多的政府网站。国外安全研究人员日前发现,Apache Struts2在处理CVE-2014-0094的漏洞补丁中存在缺陷,会被轻易绕过,可导致任意命令执行。黑客进而能够窃取到网站数据,或者对网站进行DDoS攻击。

  4月24日,360网站卫士第一时间添加防御规则,并率先发布临时解决方案;4月25日下午,Apache官方才发布Struts2漏洞的临时修复方案;4月25日晚上,360网站安全检测率先发布“Struts2漏洞检测”工具(http://safe.webscan.360.cn/loudong)。

  360网站卫士盘点了近年来曝出的高危Struts2漏洞,并分析了Struts2为什么屡屡出现重大安全漏洞。

  4年前就存在Struts2代码执行问题

  Struts2漏洞,这里主要指的是J2EE开源框架struts2出现的命令执行漏洞,危害巨大,可导致远程执行任意系统命令,进而获取系统控制权,数据库控制权,导致信息泄露。所有使用struts2框架开发的系统都受影响。

  Struts2的代码执行问题最早要追溯到2010年,当时来自Google安全Team的Meder Kydyraliev发现可以通过用unicde编码的形式绕过参数拦截器对特殊字符“#”的过滤,造成代码执行问题,官方漏洞编号S2-003,我们可以在struts2官方的漏洞公告中看到如下文字,如下图:

  

  虽然Apache官方给出了利用代码,但是对却忽视了这个漏洞的威力,因为官方看到Meder Kydyraliev给出的代码以为就是一个简单的bypass,没有意识到利用此漏洞可以远程执行任意命令,于是随意修改了一下过滤规则便草草了之了。

  当时Apache官方是这样修补的,他们用正则将含有“\u0023”的请求全部过滤掉。这样的修复根本没有起到作用,因为“\u0023”在传递过程中被转义为“\\u0023”所以正则根本没匹配上,悲剧的是他们没有意识到这个问题。

  好在官方终于发现了ognl表达式的威力,ognl可以调用java静态方法,struts2本身就是一个命令执行漏洞,于是他们修改了一些参数进而限制执行java静态方法。经过研究发现,他们修改了OGNL上下文中一些命名空间中的属性,比如将#_memberAccess.allowStaticMethodAccess设置为true,#context["xwork.MethodAccessor.denyMethodExecution"]设置为false。但是通过unicde编码绕过过滤规则的问题依然存在。他们以为这样便事大吉了。

  可能是因为Apache冷落了Google安全Team,没过多久,Meder Kydyraliev大神便发飙了,这次他构造了一个可以远程执行任意命令的利用代码提交给Apache官方,因为之前unicode编码绕过的问题一直存在,所以还是S2-003的bypass方式,只不过这次他给出了利用ONGL调用java静态函数执行系统命令的方法,并且在他的blog(http://blog.o0o.nu/2010/07/cve-2010-1870-struts2xwork-remote.html)当中给出了详细的分析,如图所示:

  

  所以S2-003的修复宣告失败,此漏洞编号S2-005,CVE-2010-1870。但是官方的修复却很简陋,他们重新修改了正则,封堵了Meder Kydyraliev的利用,但是始终没有从根本上解决问题,他们没有意识OGNL表达式用八进制编码依然是可以执行的,比如”\u0023”换成八进制的“\43”,再次绕过。

  这次,Apache官方终于意识到问题的严重性,更加严谨的改写了正则,过滤掉了出现\, @等字符的请求内容,官方修改的正则表达式,如图所示:

  

  伤痕累累的struts2

  但是struts2的问题依然存在。

  大概是2011年,Meder Kydyraliev再次发飙(CVE-2011-3923),他提出新的利用思路,借助action实例中的私有变量的set方法执行OGNL调用java静态方法执行任意命令。关于这个问题,其实还牵扯出好多web容器的特性,但是危害依然巨大,此漏洞编号S2-009,CVE-2011-3923,而官方依然是通过正则过滤的方式来修复此问题,官方修复如图所示

  

  此后还出现过S2-013利用struts2标签执行ognl的方式,但是这些漏洞都相对鸡肋,影响范围也就大打折扣了。

  事实上struts2框架底层是利用OGNL表达式来实现的,然而OGNL表达式的功能过于强大,导致可以直接调用java静态方法。但是官方为了防止在OGNL表达式中直接调用java静态方法,它在OGNL上下文中内置了几个命名对象。例如,#_memberAccess["allowStaticMethodAccess"]默认被设置为false,#context["xwork.MethodAccessor.denyMethodExecution"]默认被设置为true。

  之前的几个漏洞使官方意识到他们做的很多限制都白费,比如上面提到的这几个属性的值可以利用执行OGNL进行修改,我们不难看出上面提到的这两个漏洞都会先设置这两个属性,然后调用java静态方法。

  一直到2013年,在S2-013被爆出之后,#_memberAccess["allowStaticMethodAccess"]的属性,使它没有权限被修改。这样看似从根本上解决了问题。但是他们忘记了利用java反射类来访问私有成员变量这种猥琐的方法。关于反射类这里顺带说一下,在这之前还出现过例如S2-008命令执行,不过这其实是Struts2开发模式的一个特性,严格来讲不能算是漏洞,只不过在他的处理逻辑当中用户可以控制执行OGNL,但是默认struts2的开发模式是关闭的,所以此漏洞很鸡肋。但值得一提的是一直到2014年pwntesting的一篇分析文章中给出S2-008的利用方式,真正利用java反射类修改前面那两个属性的奇技淫巧。

  另外,还有另一种方法更加干脆,就是java.lang.ProcessBuilder这个类,随便new一个实例然后调用start()方法,便达到命令执行的目的。

  还有,去年7月份爆出的S2-016命令执行漏洞。关于这个漏洞,其实是DefaultActionMapper类支持以"action:"、"redirect:"、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致命令执行。

  一直到最近的S2-020,以及后续的补丁被绕过,又让伤痕累累的struts2火了一把,但是这次问题不是出在ognl执行上,而是换成了操控容器的classLoader属性,这个其跟前面提到的S2-009有点类似,因为struts2框架有这样一个特性,只要接受到用户提交aa=bb这样的请求时,就会通过OGNL去执行对应的setaa方法,所以当用户去提交class.classLoader….这样的参数时,当然可以操控对应classLoader的属性,至于classLoader,不同的容器有不同的属性,能够控制这些属性是很危险的,比如tomcat的docBase可以控制根目录的位置等等。

  关于S2-020的修复,官方发扬了他们一贯的作风,继续使用正则表达式这种“高端“技术过滤用户请求,可惜还是被攻击者绕过。

  就这个问题来言,想对struts2的开发人员说:还是应该关注一下底层代码。至于在S2-020补丁被绕过之后的修复,官方还是用正则,但这次他们要从根本上修复框架问题,所以坐等Apache出最终补丁吧。

  Apache官方难辞其咎

  回顾struts2的漏洞历史,我们发现官方难辞其咎。

  首先,开发人员安全意识不强,虽然采取了基本的安全措施,但是形同虚设;其次,官方修复力度不够,给人的感觉总像是在敷衍了事,未能从根本上解决问题;再就是,官方的开放精神确实很震撼,竟然直接将漏洞的PoC挂在官网上,这样给了很多人进一步研究漏洞利用的机会,这个也是导致问题更加严重的一个原因。

  近两年关于struts2的攻击事件频发,影响包括向移动、电信、联通、各大网银、证券等等各大门户网站,。因为struts2是一款功能非常强大的j2ee框架,特别是对于广大开发人员,应用非常广泛。所以一旦struts2出现0day,导致互联网上出现大面积被入侵、被拖库,信息泄露等事件。对于此问题,建议相关技术人员应及时更新struts2框架版本。有实力的公司最好自己开发应用框架,避免使用开源框架。

  struts2漏洞盘点

  影响比较大,利用比较广泛的struts2漏洞:

  2010年 S2-005

  CVE-2010-1870 XWork ParameterInterceptors bypass allows OGNL statement execution

  2012年1月 S2-008

  CVE-2012-0392 struts2 DevMod Remote Command Execution Vulnerability

  2012年1月 S2-009

  CVE-2011-3923 Struts<=2.3.1参数拦截器代码执行

  2013年 5月 S2-013

  CVE-2013-1966 Struts2 <= 2.3.14 includeParams属性远程命令执行漏洞

  2013年7月 S2-016

  CVE-2013-2251 Struts2 <= 2.3.15.1 action、redirect、redirectAction前缀远程命令执行漏洞

  2014年3月 S2-020

  Struts2 <= 2.3.16 DoS attacks and ClassLoader manipulation

  2014年4月 S2-021

  Struts2 <= 2.3.16.1 bypass patch(ClassLoader manipulation)

好文打赏,给Ta鼓励
扫一扫用手机阅读本文
Tags:漏洞  底层  代码  编写  不严  
  • 相关搜索
图片推荐
    5点有效提升网站粘性减少跳出率的小技巧

    5点有效提升网站粘性减少跳出率的小技巧

    网站粘度一定程度上代表着网站内容质量的高低,用专业词汇讲,我们的目标就是减少网站跳出率,增加网站页面停留时间。用户来到我们的网站,我们用专业的知识留住用户的同时,让用户喜欢你的站点,流连忘返这个词汇最
    淘宝双十二线下支付半天超220万笔

    淘宝双十二线下支付半天超220万笔

    12月12日,第1小时内,按捺不住的剁手族涌进淘宝网买走了100万双靴子、60万条围巾、14万罐奶粉这一天里,共有超过2万家线下门店参与双12活动,涵盖餐饮、超市、便利店、面包房等多个生活消费场景。 
    1分钟卖出21辆!小牛电动车为何受热捧?一文揭秘!

    1分钟卖出21辆!小牛电动车为何受热捧?一文揭秘!

    摘要:日前,小牛电动在其官网第二次开放购买,2万台车在15小时35分钟全部售罄,相当于每分钟卖出21.4辆,再一次创造了电动车行业的销售奇迹。牛电科技市场副总裁张一博表示,这开创了整个电动车行业的先例
    最好的企业建站香港主机介绍

    最好的企业建站香港主机介绍

    随着企业的不断发展,企业与企业之间的竞争逐渐激烈,使得不同企业间对于自身品牌建设,销售渠道的扩展,宣传方式的探索越发重视。特别是在互联网逐渐进入千家万户之后,通过搭建企业网站来建设企业的网络品牌成为企
    职场新人seo优化如何让自己提升学习效率

    职场新人seo优化如何让自己提升学习效率

    很多新人进入公司之后,没有状态,不知道从何入手,尤其是对于其他行业转行过来的seoer更是手足无措,作为职场新人我们如何才能提升自己的学习效率呢?好笔者今天以自己的实战经历和大家进行一下详细的分享。 
    QQ公众号也搞流量主,这是要直接商业化?!

    QQ公众号也搞流量主,这是要直接商业化?!

    10月26日晚,业内人士爆料:QQ公众号开通流量主功能了。  果然,在功能设置下静悄悄出现了一个广告展示功能,没有任何前提条件就可自主选择开通。    QQ公众平台刚出来时,我们还疑惑:QQ公众号处处
    网站被攻击挂马了该怎么办

    网站被攻击挂马了该怎么办

    前段时间在优化公司网站的过程中,发现公司的两个网站被攻击了,一个是被人利用数据库入侵挂马的方式,在网站的首页全是被挂马的网址链接,删都删不掉。另一个网站则是被别人采用了流量攻击方式,网站在很长的一段时
    蔡康永为奥康设计情侣鞋 将天猫盲订开卖

    蔡康永为奥康设计情侣鞋 将天猫盲订开卖

    7月8日,蔡康永为奥康鞋业设计的爱与面包系列情侣鞋项目在淘宝众筹上线。这次众筹采用了盲订的形式,具体产品将在7月18日公布、8月 8日在奥康天猫官方旗舰店正式发售。  所谓盲订,是指消费者在不知道产品
你是怎么知道非凡网赚网的?
  •   
  • 联系QQ 邮箱:976382653@qq.com 微信:976382653
    在线留言
    发布软文
    广告自助购
    文章调用
    常见问题
    保存到桌面