Shiro下的CB链
slug
series-status
status
summary
date
series
type
password
icon
tags
category
title: 【Java反序列化NDAY-叁】Shiro 下的 CB 链
date: 2023-03-06 21:14:04.835
updated: 2023-09-11 20:17:35.153
url: https://blog.tql.ac/archives/shiro下的cb链
categories:
- Java反序列化
- 网络安全 tags:
前言
话接上文,我们的Shiro默认是没有CC依赖的,仅有CB依赖,因此我们本文就来讲一下如何利用原生的CB链进行反序列化漏洞利用。
CB是什么
大家可能知道,之前我们常用的Commons Collection是对Java集合类的一个增强,而CB则是对Java Bean的一种增强。
这里我们先来简单介绍一下Commons Beanutils的一个应用。
首先我们来写一个简单的Java类:
其次我们来简单尝试用Commons Beanutils去获取一下这个类的各种属性:
输出:

这样可以实现我们可以通过字符串获取对应的对象。
而这里的底层实现如下:
我们跟进Property方法:

可以看到它调用了另一个对象的getProperty方法。
继续跟进,可以看到它调用了一个getNestedProperty方法

根据调试信息,可以看到它继续调用了getSimpleProperty:

在这个方法里会生成一个描述符,在调试时,可以看到这里最终会根据我们的输入转换为对应的Bean的驼峰描述以及对应的get和set方法名:

这里可能有同学还记得,我们之前在CC中的类加载部分有提到TemplateImpl这个类是如何实现的类加载,在TemplateImpl中就有这么一个方法
getOutputProperties
,就符合这个Bean的get方法名的格式同时它还调用了newTransformer方法:
因此,这里就有一个可以利用的点。
我们把之前的CC3的代码和这里结合一下看一下效果:
执行效果:

所以可以证明这个命令执行是可行的。
CB利用链
根据前文所说,我们要去找到如何调用
PropertyUtils.getProperty
方法。可以看到这里有一些调用:

像这里有我们很熟悉的
transform
方法。但是很可惜这个类并没有继承序列化接口。

另一个我们很熟悉的就是这个compare方法

在我们的CC2中就用到了
Comparator
。因此结合起来整体流程如下:

整合起来代码如下:
利用exp转换后发包,发现shiro报错:

但是这里有一个问题就是我这里报的错误和参考视频中不一样,参考视频中的报错为ClassNotFound

原因则是BeanComparator的构造函数会调用一个CC中的类:

而这个类在原生Shiro中是没有的。
因此我们需要调用另一个构造方法,代码修改为:
效果:

YSO问题
yso如果直接对原生的Shiro攻击会存在CB版本问题,因为YSO里是1.9.2的版本的CB,而Shiro里是1.8.3,因此会报错。
总结
有一个小问题没有解决,不知道为什么我的报错不是类notfound。。
Loading...