Spring4Shell?

admin 2025年2月22日00:20:33评论4 views字数 2604阅读8分40秒阅读模式

声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

首先本文不涉及漏洞的具体复现与POC,如果你想从本文中获得这些信息,恐怕你要失望了!

背景介绍

话说今天一早,骨哥被一位妹纸在微信上直击灵魂的询问道:“能给说说Spring Framework的RCE漏洞不?“,骨哥当时的内心是:Spring4Shell?Spring4Shell?Spring4Shell?

说实话,最近的骨哥除了各种工作上的事情外就是被各种Fuzz报错困在其中,依稀记得前几天在某个群里瞟到过一眼Spring漏洞。

为了给妹纸一个满(提)意(升)答(好)复(感),于是就有了今天这篇文章,当然时间仓促,文章内容可能会有错误,也欢迎大家指正。

起因

首先是CVE-2022-22963(Spring Cloud Function 中的 SpEL 表达式注入漏洞),该漏洞由绿盟于 3 月 28 日披露。

然后就是今天所说的这枚RCE 漏洞,也被网友们称为“Spring4Shell/Springshell”,在Spring Framework 中基于 Java的 核心模块中被发现。

随后安全圈的一些大佬也是频频暗示和发声:

Spring4Shell?

Spring4Shell?

Spring4Shell?

Spring4Shell?

而这枚RCE漏洞的POC据说最初是由一位国内安全研究员(GitHub上ID:helloexp)首先发布在Github,当然该POC很快被删除,但毕竟互联网是有‘记忆’的。

Spring4Shell?

CVE-2022-22965

很快Rapid7 与其它安全公司以及Spring.io 共同证实了该0day漏洞的存在,目前该漏洞被追踪为CVE-2022-22965。

2021 年底,被阿里云安全团队发现的 Apache Log4j2 远程代码执行漏洞(也称为Log4Shell ) 似乎还‘热情未消’,此时又爆出Spring的RCE漏洞,着实让各大公司IT运维人员神经紧绷。

对比

首先我们来看一张图(一图胜千言):

Spring4Shell?

无论是22963还是22965,这两个漏洞级别同属“严重”级,两个漏洞针对的组件不同,22963针对的是Spring Cloud,而22965针对的是Spring Framework,相较而言,22965涉及的面更广。目前这两个漏洞的官方均已提出修复方案,升级Spring版本即可。

当然如果出于业务考虑,暂时无法升级Spring Framework版本的话,安全厂商也给出了一些临时应急方案:

  • 在WAF等安全设备上,根据实际流量情况对“class.*”、“Class.*”、“*.class.*”、“*.Class.*”等字符串进行规则过滤(当然,规则设置好以后最好进行测试,避免对业务造成影响)

  • 在应用中全局搜索@InitBinder注解,查看方法体中是否调用了dataBinder.setDisallowedFields方法,如果找到这段代码片段的描述,将{"class.*","Class.* to the original blacklist ","*.class.*", "*.Class.*"}。(注:如果这个代码片段使用的比较多,需要多处追加)

  • 在应用程序系统的项目包下创建全局类,并确保这个类由Spring加载(建议将其添加到Controller所在的包中),添加类之后,项目需要重新编译和打包,并进行功能验证测试。然后重新发布这个项目

import org.springframework.core.annotation.Order;        import org.springframework.web.bind.WebDataBinder;        import org.springframework.web.bind.annotation.ControllerAdvice;        import org.springframework.web.bind.annotation.InitBinder;        @ControllerAdvice        @Order(10000)        public class GlobalControllerAdvice{              @InitBinder             public void setAllowedFields(webdataBinder dataBinder){             String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};             dataBinder.setDisallowedFields(abd);             }        }

成因

CVE-2022-22965(Spring4Shell) 成功绕过了CVE-2010-1622中阻止远程代码执行的补丁,该补丁删除了反序列化功能,如下所示:

Spring4Shell?

该漏洞会影响使用RequestMapping注解和 POJO(Plain Old Java Object)绑定的参数值,RequestMapping 使用id 的setter和getter来设置和获取特定参数的值所以漏洞与Log4J的反序列化利用并不相同。

因此,如上项目如果托管在Tomcat,就可以通过输入特定的curl命令修改Tomcat的日志记录属性,从而在Tomcat根目录中上传WebShell。

利用条件

当然,要利用该漏洞,必须满足如下5个条件:

  • Spring Framework 版本 为5.3.0 到 5.3.17、5.2.0 到 5.2.19 以及更早版本

  • JDK 9或更高版本

  • 将Apache Tomcat作为Servlet容器

  • 以war包形式部署

  • 依赖于Spring-webmvc或Spring-WebFlux

同理,该漏洞的利用条件也相较Log4J困难很多。

参考资料

https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

https://www.cyberkendra.com/2022/03/spring4shell-details-and-exploit-code.html

https://sysdig.com/blog/cve-2022-22965-spring-core-spring4shell/

https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/

https://www.infoq.cn/article/yKWU6v6UktvAtvxVvQ2W

====正文结束====

原文始发于微信公众号(骨哥说事):Spring4Shell?

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月22日00:20:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Spring4Shell?https://cn-sec.com/archives/864732.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息