【云攻防系列】漏洞考古归因之Spring与Struts2

admin 2023年2月17日00:54:46评论62 views字数 2713阅读9分2秒阅读模式
【云攻防系列】漏洞考古归因之Spring与Struts2

前言

今年三月底,Spring core 爆出了一个 RCE 漏洞(CVE-2022-22965),受到了广大安全、开发、运维人员的关注。随着POC 与 EXP 的披露,我们对其 Payload 的部分观察,不难发现其实该漏洞与早期 Struts2 曾经爆出的 RCE 漏洞(S2-020)有着很相似的部分。


在进行分析过后,发现两者(CVE-2022-22965和S2-020)的漏洞成因可以称得上的是“殊途同归”。我们对于未知的漏洞,其实很大程度上可以依据漏洞的相似性进行防御。而这些相似性,也可以给我们白帽子在漏洞挖掘方面带来启发。


本文将对两个漏洞进行对比分析,最终找到两个漏洞的相似之处。

CVE-2022-22965 和 S2-020 漏洞简介及影响

【云攻防系列】漏洞考古归因之Spring与Struts2

CVE-2022-22965 漏洞概述及影响

一直以来,Spring 是编程开发的必选技术之一,该框架是一个轻量级的应用框架,具有很高的凝聚力和吸引力。Spring 框架因为其强大的功能和超强的性能越来越受开发人员的喜欢。


在3月29日晚间,不少国内外网友陆续爆料 Spring 框架协议出现 “史诗级” RCE 漏洞,Spring 官方在接到此消息后马上开展了分析修复工作,并计划于 3 月 31 日发布修复后的版本。但与此同时,漏洞的详细信息于 3 月 30 日已在网络上泄露,引发了大家对此漏洞的高度重视。


这个漏洞影响的是在 JDK9+ 上运行的 Spring MVC 和Spring WebFlux 应用程序,需要应用程序作为WAR部署在 Tomcat 上运行。而使用 Spring Boot 的 jar 包方式运行时,则不受影响。但是,官方也在公告中提醒,该漏洞的性质更为普遍,可能还存在其他的利用方法。

【云攻防系列】漏洞考古归因之Spring与Struts2

S2-020 漏洞概述及影响


Struts2 是在 Struts1 基础上,融合了另外一个优秀的框架WebWork 后发展而来的。Struts2 以 MVC 架构为基础的WEB 框架,通过 WEB Filter 的方式内嵌在 WEB 服务器中进行使用。我们遇到的一些以 action 为后缀的网站,很大一部分都是使用了 Struts2 框架。


S2-020 官网在 S2-020 的漏洞公告里介绍了两种攻击方式。一是通过 Commons-fileupload 造成的拒绝服务攻击;二是通过映射主机共享目录而进行远程命令执行。


其实在网上还有一种利用方式,与 Spring core RCE 的利用方式非常接近,因为篇幅的关系,仅仅对两种漏洞一些关键的部分进行分析。


S2-020漏洞分析

首先分析 S2-020。在 Struts2 中,提交表单时,只要Action 中的属性有 Setter 方法,就可以将这些表单数据赋值到 Action 实例中。那么该功能如何实现的呢?


该功能是通过 ParametersInterceptor 拦截器,解析请求中的参数,并且赋值给 action 中对应的属性所实现的。


主要代码分析如下,在 101 行获取了 URL 中的参数,在114行调用了 setParameters() 方法:

【云攻防系列】漏洞考古归因之Spring与Struts2


跟入 setParameters() 方法,其中 329 行的newStack.setParameter(name, value) 利用了 OGNL 调用了对应的 Set 方法,而由于每个 action 必然继承容器的classLoader,所以必然可以通过 action 去覆盖 classLoader 的相关属性,修改 tomcat 的日志位置、后缀等造成 RCE 。


【云攻防系列】漏洞考古归因之Spring与Struts2
【云攻防系列】漏洞考古归因之Spring与Struts2

CVE-2022-22965 漏洞分析

对 Spring-core 漏洞分析之前,首先了解一下 Spring 一个非常重要的组成:属性访问器(PropertyAccessor),它是可以访问命名属性(name properties)的类的公共接口。该接口的作用是存取 Bean 对象的属性。


可以看到 BeanWrapper 就是继承了该接口:

 

【云攻防系列】漏洞考古归因之Spring与Struts2


接下来进行代码分析,我先在AbstractNestablePropertyAccessor 类的 256 行打一个断点,然后访问 localhost:8080/springrce1/hello?name=aaaa,可以看到getPropertyAccessorForPropertyPath 方法通过propertyName 可以找到目标存在的属性,并且转换为BeanWapperImpl 类:


【云攻防系列】漏洞考古归因之Spring与Struts2


接着在 266 行调用了 setPropertyValue() 方法:


【云攻防系列】漏洞考古归因之Spring与Struts2


跟入 setPropertyValue 方法,在 278 行调用了processLocalProperty()方法:


【云攻防系列】漏洞考古归因之Spring与Struts2


跟入 processLocalProperty() 方法,在 441 行调用了getValue() 方法:


【云攻防系列】漏洞考古归因之Spring与Struts2


在 458 行调用了 setValue() 方法:


【云攻防系列】漏洞考古归因之Spring与Struts2


先跟入 getValue() 方法,在 388 行可以明显看到使用了java 的内省:


【云攻防系列】漏洞考古归因之Spring与Struts2


到这里就说明了跟 s2-020 的一个相同点,都是调用了 Set方法对属性赋值。不过 Spring 需要首先可以获得到classLoader,最终对属性赋值。


这里简单介绍一下 java 的内省,内省和反射机制很类似,它同样也是框架设计必不可缺的部分。在 Spring 框架中,大量使用了内省用来操作 Java Bean 的属性,其不仅在上述的几个地方使用,还同样在我们所熟悉的CachedIntrospectionResults 类下也有使用。


下面是 java 内省的代码示例,我用内省的方式调用了 User 类的 SetName 方法:


BeanInfo beanInfo = Introspector.getBeanInfo(User.class);/*** 调用get、set方法*/PropertyDescriptor name = new PropertyDescriptor("name",User.class);System.out.println(name.getReadMethod());User user = new User();name.getWriteMethod().invoke(user,"aaa");


下面为 User 这个实体类的代码:


【云攻防系列】漏洞考古归因之Spring与Struts2


可以看到成功调用到了其 Set 方法。


【云攻防系列】漏洞考古归因之Spring与Struts2

总结

随着互联网的发展,一些软件使用的第三方库越来越多,一些组件的安全漏洞也不容忽视。0Day 层出不穷,往往使安全工作人员措手不及,但是漏洞的原理是互通的,我们对于漏洞的防御方式也可以参照以往漏洞。


我们分析复现一些新爆出的 0Day 时,其实可以发现很多新漏洞是有以往漏洞的影子。这对于我们发现新的漏洞是有着很大的帮助。


这些第三方组件库,是业务的基石。而这些第三方组件库的安全,同样影响着云业务的安全。对于这些漏洞,深信服创新研究院云安全团队也会一直探索下去,促进更安全的业务系统。

【云攻防系列】漏洞考古归因之Spring与Struts2

原文始发于微信公众号(深信服千里目安全实验室):【云攻防系列】漏洞考古归因之Spring与Struts2

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月17日00:54:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【云攻防系列】漏洞考古归因之Spring与Struts2https://cn-sec.com/archives/1275039.html

发表评论

匿名网友 填写信息