Spring been CVE-2022-22965

0x00 前言

Spring bean的漏洞被吹的很火,比如放个打码的图片,然后弹个计算器。自己又比较拖拉,所以一直没有写完分析文章。而且Spring相关的内容一直没有整理,可能要到之后慢慢来进行整理。首先来说CVE-2022-22965,实际上这个漏洞的主要成因和cve-2010-1622一样,所以这两个漏洞写在一起。

JDK 9的发布时间为:2017-09-21,也就是说这个漏洞实际上是在野漏洞,距今也有5年了,如果是了解cve-2010-1622漏洞原因以及修复方式的同时了解JDK9的特性,那么这个利用周期就不好说了。

0x01 cve-2010-1622

先来说cve-2010-1622,网上基本的poc都是class.classLoader.URLs[0]=,而官方的修复方式也是通过这个来做了一个黑名单操作。而黑名单具有极强的不可控因素。

1、环境

public class User {
    private String name;
    private String[] age= new String[]{"1"};;

    public String getName() {
        return name;
    }

    public String[] getAge() {
        return age;
    }
}

这个demo中可以看到并没有set方法,而只是存在getAge方法。

2、调试过程

首先断点直接下在 org\springframework\beans\AbstractPropertyAccessor.class setPropertyValues这里,如下图所示: 这个方法实际上就是通过属性访问器直接set属性值
在这里插入图片描述
setPropertyValue 其中关键的还是nestedPa.setPropertyValue(tokens, pv);通过属性访问器设置值
在这里插入图片描述
接着在setPropertyValue中进行判断,如果是string等基础类型走processLocalProperty,如果是Array等类型走processKeyedProperty

在这里插入图片描述

在processKeyedProperty中通过getPropertyHoldingValue获取getter的值
在这里插入图片描述
通过getPropertyHoldingValue中getPropertyValue获取数据
在这里插入图片描述

在获取数据中,会先去调用getLocalPropertyHandler,然后调用getPropertyDescriptor
在这里插入图片描述
最终调用的就是CachedIntrospectionResults的forClass方法进行内省并缓存,底层调用的就是java的内省机制,Java的内省机制就是针对JavaBean的,可以获取到类的属性名称,以及属性的Getter和Setter方法。
在这里插入图片描述
这里的CachedIntrospectionResults主要是专门提供了用于缓存JavaBean的PropertyDescriptor描述信息的类,在工厂类中,可以通过forClass找到对应的CachedIntrospectionResults实例,如果没有的话会通过new CachedIntrospectionResults(beanClass);进行创建
在这里插入图片描述
在CachedIntrospectionResults中会通过Introspector.getBeanInfo会获取到beanClass以及其父类的属性
在这里插入图片描述
在获取到bean属性之后,会进行一个put操作,同时进行了一个黑名单处理classLoader以及protectionDomain
在这里插入图片描述

接着回到processKeyedProperty来看cve-2010-1622漏洞原因

在这里插入图片描述
在处理Array的时候会对Array进行set操作,也就是说会自动调用set操作进行覆盖。
在这里插入图片描述

利用方式:class.module.classLoader.URLs[0]=

0x02 CVE-2022-22965

接着来看CVE-2022-22965,实际上CVE-2022-22965的出现仅仅是因为JDK9中出现了module,可以通过module来获取到ClassLoader。

在JDK9引入了模块系统

为什么引入module?可以参考:https://zhuanlan.zhihu.com/p/167729732

0x03 官方修复

https://github.com/spring-projects/spring-framework/commit/afbff391d8299034cd98af968981504b6ca7b38c

在这里插入图片描述

修复的第一个点 检测方法名是否包含name,并且结尾不是Name,则退出

if (Class.class == beanClass && (!"name".equals(pd.getName()) && !pd.getName().endsWith("Name"))) {
					// Only allow all name variants of Class properties
					continue;
				}

第二个修复点就是:对PropertyType值进行判断不能是ClassLoader以及ProtectionDomain

if (pd.getPropertyType() != null && (ClassLoader.class.isAssignableFrom(pd.getPropertyType())
								|| ProtectionDomain.class.isAssignableFrom(pd.getPropertyType()))) {
							// Ignore ClassLoader and ProtectionDomain types - nobody needs to bind to those
							continue;
						}

参考

  • 【Java版本】https://blog.csdn.net/qq_26264237/article/details/90576007
  • 【参数绑定】https://blog.51cto.com/u_14890701/2519693
  • 【JDK9】https://zhuanlan.zhihu.com/p/167729732

有空可以关注一下公众号鸭

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘟嘟_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值