Struts2安全漏洞频出 ,多因Apache官方代码编写不严谨

来源:互联网 发布:服务器端口怎么关闭 编辑:程序博客网 时间:2024/04/30 20:41

http://www.freebuf.com/articles/web/33301.html


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

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

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

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

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

    官方给出了利用代码,但是对却忽视了这个漏洞的威力,因为官方看到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当中给出了详细的分析,如图所示:

    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的问题依然存在,不知道过了多久大概是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()方法,便达到命令执行的目的。所以apache改了半天有白忙活了。

    关于比较火的struts2命令执行漏洞,在就是去年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挂在官网,这样给了很多人进一步研究漏洞利用的机会,这个也是导致问题更加严重的一个原因。其实责任很明显,apache官方的问题。在这里我想提醒广大java开发人员以及系统运维人员,面对这么一个漏洞百出的框架,你还敢用吗,还是早日换掉这个危险的struts2吧!

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

struts2漏洞盘点

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

2010年 S2-005

CVE-2010-1870 XWork ParameterInterceptors bypass allows OGNLstatement 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)

具体参照struts2官网提供的漏洞历史:

https://cwiki.apache.org/confluence/display/WW/Security+Bulletins


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 护照在国外掉了怎么办 上海动迁房户口怎么办 政府强制拆房怎么办 农村无证宅基地怎么办 身份证没磁怎么办护照 买安置房怎么办产权 安置房房东违约怎么办 安置房产权到期怎么办 安置房怎么办房产证吗 美甲后指甲长了怎么办 在菲律宾怎么办持枪证? 绝地求生打不准怎么办 身份证号码变更后社保怎么办 社保与身份不符怎么办 年龄改了学籍怎么办 结婚证信息错误怎么办 六级身份证过期怎么办 身份号泄露了怎么办 身体证信息泄露怎么办 手机号被泄漏了怎么办 姓名和电话泄露怎么办 个人身份证信息泄露怎么办 身份号码泄露了怎么办 我身份证泄露了怎么办 身份证信息泄漏了怎么办 无锡身份证丢了怎么办 人在外地怎么办身份证 欠空放公司不还怎么办 兼职要身份证照片怎么办 身份证刷不了磁怎么办 身份证不能刷了怎么办 身份证指纹错了怎么办 指纹手机丢了怎么办 异地办理临时身份证怎么办 杭州办理外地身份证怎么办 办理身份证没有户口本怎么办 2018身份证掉了怎么办 双户口注销社保怎么办 常用户口被注销怎么办 刚到厦门怎么办身份证 新疆身份证丢了怎么办