查看原文
其他

Struts,你再也不是当年那个"小甜甜"了!

忆蓉之心 Java面试那些事儿 2020-10-08

好了,言归正传,今天咱们来聊 「Struts 」 这个话题。



肯定有很多同学会说,你为什么对Struts这么大的成见呢?因为它出现的安全问题太多了,并且针对安全问题,响应速度太慢,给国内外的不少企业造成巨额损失。


# 发展历程


要彻底搞清楚它,你就得去了解它的历史。说起 Struts,则就要从 J2EE 的 Web 项目发展初期说起,那个时候还处于刀耕火种的时代,大家开发 Web 项目除了使用 servlet 技术外,普遍都在 jsp 源码中,采用 Html 和 Java 代码"混搭模式"。这种模式造成一个弊端,业务逻辑和表现层代码混合在一起,导致开发和维护的成本逐渐偏大。为了摆脱这种弊端,大家提出了 MVC 这种软件架构模型来开发 Web 项目,见下图。



由于没有开源统一的 MVC 框架,大家基本上都在各自开发各自的框架。我认识的一个朋友给我说,那个年代如果能写一个 MVC 的框架,基本上都会是公认的大牛。


刚好 2000 年,国外叫 Craig McClanahan 的哥们儿采用了 MVC 的设计模式创造了 Struts,后来一度被认为是使用最广泛、最流行 Java 的 Web 应用框架。


2006 年,Struts 与 WebWork 合并,整合各自的优点,诞生了一个新的框架,就是如今的 Struts2。原先的 Struts 版本被改名为 Struts1 ,于 13 年 4 月停止开发。



这里不得不提的是 Struts2 的 OGNL 表达式,由于功能过于强大,极易产生远程执行漏洞,而开发组成员对漏洞的处理能力不足,导致应急响应修复一等再等,逐渐失去自己的市场份额,给了类似于 Spring MVC 等框架更多的机会...


# 漏洞响应速度如龟速


我为什么要说它的响应速度很慢呢?就以它曾经的一个漏洞(编号 CVE-2018-11776)为例。


2018年4月10日:Man Yue Mo 首次向 Struts 安全团队通报此漏洞详情。


2018年6月25日:Struts 团队发布补丁,修复此漏洞。


2018年8月22日:Struts 新版本发布「2.3.35和2.5.17」,Struts 团队和Semmle 安全研究团队共同发布公告。


说实话,对它的响应时间着急,给那些黑产真的留下充足的作案时间和机会。


有同学可能会说,这个漏洞可能不危险,那咱们接着往下看。


这到底是一个什么样的漏洞呢?


该漏洞在开发人员未设置 namespace 值且上层动作配置 Action Configuration 也未设置 namespace 值或使用通配符时可能会导致远程代码执行漏洞,见下图。



还是不明白的同学,咱们可以通过 lgtm 网站提供的漏洞演示视频来看一下它的危害。


https://v.qq.com/txp/iframe/player.html?width=500&height=375&auto=0&vid=w1347tgt5wc


上面的视频,看懂了吧,你这下应该清楚它的危害了吧!


其实对于了解 Struts 安全的读者来说,它已经不是第一次爆远程代码执行漏洞了,各位读者看看它的漏洞列表便明白了。



说实话,因上图这些Struts框架漏洞而造成巨额损失的企业不在不少,这里就给各位同学罗列一家。比如,2017年9月,美国3大老牌征信企业之一的 Equifax 公司网站遭遇黑客攻击,1.43亿美国公民的个人信息泄露,危及用户的社会保障号码、出生日期、住址以及部分驾驶执照号码等,事后溯源发现是由于该网站未修复的 Struts 漏洞「CVE-2017-5638」引起的。


到这里,有同学可能会问,以后遇到这样的Java框架漏洞,该怎么防范呢?


最直接暴力的方式禁用JVM执行外部命令,这个我们之前的一篇安全漏洞分析文章提过(Java安全之反序列化漏洞分析)。


# 怎么挖框架漏洞?


就像我一个做安全的朋友曾说过的,黑客攻击的最高境界就 9 个字「进得去,站的住,出得来」。在我看来,安全最重要的因素还是人,因此,我也一直认为社会工程学是最牛掰的(不接受反驳)。


那我先来说怎么通过社会工程学让别人中招呢,其实很简单,因为很多逗逼会不假思索的去照着教程去做,如果写教程的人留下一些后门,中招就再所难免了。这只是一点,其实还有很多,说白了还是人的问题,不是流行这一句话「傻子太多,骗子不够用」,建议大家去读一本书《社会工程:安全体系中的人性漏洞》。



我觉得对于你要挖掘一个网站的漏洞,你首先要知道它用了什么框架?也就是我们常说的嗅探「即信息收集的过程」。一般来说,我们可以通过后缀名或路径来判断,比如 .action、.do、/action/xxx、.form、.vm、.jsf 等,相信读此文的大多数读者都是开发者,一看到这样的后缀,多半就能猜测出来是用了什么框架。


但是,这也不是绝对的,有的开发者还是很聪明的,会重写 URL ,如果重写了怎么办呢?我这里给各位读者提供两种思路。


  • 利用一些框架的特殊性,比如 struts2 在 URL 请求后面加一个参数 ?actionErrors=aaaaa ,就会让页面报错;又比如,Spring MVC 的<form:checkbox path='ids' value='1'/> 会生成一个隐藏域  <input type='hidden' name='_ids' value='on'/>;等等。

  • 可以想办法让页面报错,通过报错信息来判断。


有同学可能会说,要是异常统一处理了呢?你自己不去思考,还想挖洞...


我觉得最重要的还是经验,熟悉各大漏洞的成因,比如 common-io 的拒绝服务漏洞、Java浮点漏洞、反序化漏洞、xxe漏洞、Java Hash碰撞的拒绝服务漏洞 等等。


由于 Java 强大的开源社区,各个框架都会多多少少依赖一些开源组件,如果一个组件出现了问题,则会影响一大片框架。比如之前的 CommonsCollections 组件的反序列化漏洞导致JBOSS,weblogic等中间件跟着受影响,这又能怪谁呢?如果你是团队的 Leader,建议统一规范化团队的组件,定期更新。


最后,我觉得对于一个框架而言,最重要的是做到「大道至简」。既然 OGNL  表达式总是出问题,为何不把 OGNL 作为一个插件,把选择权交给用户,让自己的核心功能更加稳定健壮呢?为什么不多招募一些安全爱好者加入自己的团队?办法总比问题多~~~


# 学习 Struts 还有“钱”途吗?


没“钱”途。


我们随便去一个招聘网站找一条招聘信息看看,就可以发现技术栈是SSH的已经很少了(ssh:Spring+Structs+Hibernate),基本上已经绝迹,就算有招聘的,应该也是一些需要维护的项目,让你去填坑的。现在,基本都是把Structs换成了Spring MVC,见下图



我们再来Github上面看看,也能间接的说明一些问题。


Struts现已交于Apache(见下图),但star数依然少的可怜,我觉得它要达到当年辉煌的顶峰,太难了!



Spring MVC是Spring家族中的一员(见下图),要人有人,要钱有钱,要被时代淘汰太难了!



如果你是接触Java Web开发的新人,我还是建议你把学习得重心放在Spring MVC。有多余的时间,再去研究Struts吧!


有的同学可能会说,它是被“后浪”拍死的,在我看来,它是被自己拍死的!


其实人也一样,如果一个人不思进取,那么,被时代淘汰也是迟早的事情,共勉~~~


# 参考


https://struts.apache.org/index.html

https://zh.wikipedia.org/wiki/Struts


 往期推荐 

🔗


 

点击阅读原文,获得更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存