51阅读吧 - 为您打造专业优质的文章分享平台!
您的当前位置: 51阅读吧 >

struts2漏洞|Struts2漏洞解读:官方惹祸 黑客攻防

NO.1 Struts2漏洞解读:官方惹祸 黑客攻防

  文/顾晓波

  随着苹果开发者网站的沦陷,已经曝光一周的Apache Struts2漏洞再次成为热门话题,今天有消息称由于该漏洞被利用,淘宝的数据库已经被盗,尽管淘宝官方否认了这一说法,但是从乌云漏洞平台的报告看,该漏洞已经波及到了包括京东、淘宝等在内的大型网站。

  Struts2应用范围有多广?此次漏洞有多严重?哪些网站受到了波及?可怕在哪里?网易科技请教了多名安全界人士,对该漏洞进行详细解读。

  1、什么是Struts 2漏洞?

  Struts 是Apache软件基金会(ASF)赞助的一个开源项目,通过采用JavaServlet/JSP技术,实现基于Java EEWeb应用的MVC设计模式的应用框架,Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

  Struts框架广泛应用于政府、公安、交通、金融行业和运营商的网站建设,作为网站开发的底层模板使用。

  此次爆发的漏洞是Struts 2的一个远程执行漏洞,利用这个漏洞,攻击者可以上传后门,黑掉一个网站或者盗取用户数据库。

  2、为什么此次Struts 2漏洞影响巨大?

  第一,Apache官方在漏洞公告中直接把漏洞利用代码公开了,这是一个令人震惊的做法,因为在公布之前还有很多网站没有及时打上补丁。公布后该漏洞疯狂传播,并出现了直接利用该漏洞进行入侵的傻瓜工具,一些未及时更新补丁的网站被入侵。

  第二,Apache Struts2是一个应用框架,它的漏洞并不像Windows一样,及时发个补丁推送给用户,更新了就没事了,而是需要站长和网站维护人员自己去更新这个补丁,国内并不是每个网站的技术人员都会第一时间注意并更新这个漏洞。

  第三,在漏洞被公布后黑客们为了展示“战果”,把大量存在漏洞的网站公布在第三方平台上,很多之前没有关注到该漏洞的黑客们开始关注并寻找漏洞。

  3、哪些网站中招了?

  乌云漏洞平台最新确认的漏洞名单中,中国电信、中国联通等运营商部分分站,中科院、工信部、交通部、中国邮政等部分站点,以及腾讯、淘宝、搜狐等大型互联网公司的部分分站均在列,不过很多分站并不涉及数据库。

  中招的不止是国内网站,苹果开发者网站“宕机”5天后,苹果也终于承认是遭到入侵,业内猜测可能是由于Stuts2漏洞,随后Ubuntu的开发者社区也被黑,182万用户数据被盗,尽管数据已经加密,仍然存在一定安全隐患。

  此次受影响最严重的是京东,在乌云平台上有十几个漏洞被提交,涉及的站点包括奢侈品站360Top、彩票页面、充值页面、支付成功页面等。

  4、波及的网站包括一些银行网站和淘宝等电商网站,对用户而言是不是很危险?

  此次波及的网站中有一部分银行的分站,并不涉及数据库,不过如果是存在登录功能,则黑客可以通过挂马的方式在用户登录过程中盗取银行账号和密码,所以还是有一定危险性。

  淘宝网今天发布声明否认了漏洞被利用的说法。淘宝确实在一些非常边缘的站点使用过Stuts 2框架,但是后来开发了自己的框架,主要业务并没有受到影响。

  5、是否已经有网站被拖库?

  拖库是指将从数据库导出数据,各大网站通常会将数据库进行加密,黑客会将这些数据库破解并获得数据。

  目前还没有确切证据标明已经有大型网站的数据库被拖库,黑市上也没有新的数据库出现,因为漏洞公开时间不长,影响可能要到几个月后才会显现。

  6、业内传言

  ①、黑客很忙。很多黑客此前已经掌握了一些网站的漏洞,并获取了权限,此次Struts漏洞泄露后,为了防止其他黑客通过该漏洞也获得这些网站的权限,这些黑客会主动去修复“肉鸡”的漏洞,一方面另一波黑客要争取抢在漏洞被修复前完成入侵,于是双方展开了攻防战,在这期间很多网站发现其漏洞被“自动修复”。

  ②、Apache作恶。有黑客称自己在5月份已经发现两个远程执行漏洞,提交后Apache官方只是出了一个声明确认了该漏洞,但是并未发布补丁。这已经不是Struts第一次出现漏洞,但是官方对于安全问题的处理简单粗暴,甚至需要修补多次才能修好,此次更是“奇葩”到直接公布了漏洞的利用方法。

  尽管目前官方发布了补丁,不过按照此前的经验,该补丁是否可以彻底消除安全隐患还有待观察。

  以上信息引用自多名安全行业从业者口述,以及“道哥的黑板报”等公众账号。

NO.2 Struts2 S2-016漏洞修复总结

Struts2的S2-016漏洞是之前比较重大的漏洞,也是一些老系统的历史遗留问题

此漏洞影响struts2.0-struts2.3的所有版本,可直接导致服务器被远程控制从而引起数据泄漏,影响巨大

漏洞修复总结有4种方式:

1、升级版本

这也是Apache官方给出的建议,把Struts2的版本升级到2.3.15以上的版本,这种方式只需要替换一些jar包,归纳如下:

commons-lang3-3.2.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
ognl-3.0.6.jar
struts2-core-2.3.24.jar
struts2-spring-plugin-2.3.24.jar
xwork-core-2.3.24.jar

只需要用上述jar包(版本可能会有差距)替换老系统中的旧版本jar包;

但是这种方式存在一定的缺陷,如果系统非常复杂,可能会有版本不兼容,jar版本冲突,导致系统功能不能 使用的情况;

2、覆盖JAR包



下载上述图片,把后缀名改为zip,把里面解压出来的三个文件夹添加到漏洞的系统的src目录下

然后再web.xml文件中添加代码:


<listener>
<listener-class>org.hdht.commonweb.listener.MyServletContextListener</listener-class>
</listener>


最后发布项目,重启服务器

3、修改Struts2的源码

找到项目中的struts2-core-2.2.3.jar,反编译得到源码,在eclipse中新建一个java项目,把反编译的源码导进去

修改orgapachestruts2dispatchermapperDefaultActionMapper.java这个文件中的handleSpecialParameters方法

在while循环(for循环)中加入下面代码:


if (key.endsWith(".x") || key.endsWith(".y")) {
key = key.substring(0, key.length() - 2);
}



保存,这个新项目可能会有错误,需要导入两个jar包,xwork-core-2.1.6.jar和servlet-api.jar

把这个新项目导出成jar包,把下图中的7个类,替换掉原先struts2-core-2.2.3.jar中的7个类


4、结合上面的第2和第3种方式

还是需要用到struts2的源码,同第3步,反编译得到源码,导入到一个新的项目中

下载第2步中的压缩包,解压之后得到三个文件,把这三个文件夹添加到新项目的 orgapachestruts2dispatchermapper包中,如下图



然后,再修改orgapachestruts2dispatchermapperDefaultActionMapper.java这个文件中的handleSpecialParameters方法

在while循环中加入如下代码:


if (JavaEEbugRepair.repair_s2_017(key)) {
return;
}
if ((key.contains("action:")) || (key.contains("redirect:")) || (key.contains("redirectAction:"))) {
return;
}



保存,把新项目导出成jar包

把原来jar中的7个类替换,加入新包repair,再把替换之后的jar复制到项目中,替换之前的jar包

总结:

以上4种方式基本能处理所有项目的S2-016漏洞;

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

  日前,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()当中给出了详细的分析,如图所示:

  

 

  所以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)

NO.4 Apache Struts2高危漏洞来袭,请站长及时关注

  国内知名安全漏洞平台乌云网站显示,从昨日开始,收到国内大量知名站点因使用Struts应用框架产生的漏洞,涉及网站包括库巴网、百度、中国联通分站、易宝支付、土豆网、京东商城、1号店、百合网、网易、搜狐、淘宝等。百度站长平台也发布了安全风险通告:

  亲爱的站长朋友,

  大家好,昨日互联网遭受了一场漏洞风波——Apache Struts2高危漏洞,影响到Struts 2.0.0 -Struts 2.3.15的所有版本。包括国内很多知名网站在内的大量网站受到此漏洞不同程度的影响。攻击者可以利用该漏洞执行恶意java代码,最终导致网站数据被窃取、网页被篡改等严重后果,使网站及网民安全受到了极大的威胁。

  为了避免站长们的损失,百度站长平台现发出安全风险通告,请站长们排查网站是否使用Struts2框架,如使用请您及时诊断自己网站是否存在该漏洞。为此,安全联盟合作伙伴scanv安全中心紧急开发了一款在线小工具,可以帮您快速诊断是否存在此漏洞,详情点击:http://www.scanv.com/tools/ 。

  如果您的网站存在此漏洞,请您进行紧急修复,升级至官方最新版本Struts 2.3.15.1,下载地址:http://struts.apache.org/download.cgi#struts23151

  本文源自张鑫博客:http://www.semzhangxin.cn 张鑫博客:专注于网络营销与SEO,网络营销、网络推广、网站优化、网站运营策划、SEO、SEM的观点交流和经验分享。

NO.5 Struts2曝高危漏洞 黑客攻克大量知名站点

51阅读吧(51jianli.com)7月18日整理:国内知名安全漏洞平台乌云网站显示,从昨日开始,收到国内大量知名站点因使用Struts应用框架产生的漏洞,涉及网站包括库巴网、百度、中国联通分站、易宝支付、土豆网、京东商城、1号店、百合网、网易、搜狐、淘宝等。

国内知名安全漏洞平台乌云:漏洞提交列表 51阅读吧配图

据了解,攻击者可以利用Struts应用框架的命令执行漏洞,执行恶意Java代码,最终导致网站数据被窃取、网页被篡改等严重后果。

Struts通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品,是应用最广泛的Web应用框架之一。

目前,官方已经发布高危安全漏洞补丁升级(最新版本为:2.3.15.1,下载地址:http://struts.apache.org/download.cgi#struts23151),升级修补了多个安全漏洞,其中包括这个远程任意代码的高危安全漏洞。

上一篇:复活读后感500字|《复活》的读后感500字 上一篇:盗版三国志富豪版|盗版三国志正式版详细攻略富豪版
与该文相关的文章

温馨提示:如果您对51阅读吧有任何建议,请通过网站联系邮箱向我们反馈,感谢各位的建议与支持!