[Java反序列化]Java-CommonsBeanutils1利用链分析

Posted Y4tacker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java反序列化]Java-CommonsBeanutils1利用链分析相关的知识,希望对你有一定的参考价值。

反序列化调用链

ObjectInputStream.readObject()
	PriorityQueue.readObject()
		PriorityQueue.heapify()
			PriorityQueue.siftDown()
				siftDownUsingComparator()
					BeanComparator.compare()
						TemplatesImpl.getOutputProperties()
							TemplatesImpl.newTransformer()
								TemplatesImpl.getTransletInstance()
									TemplatesImpl.defineTransletClasses()
										TemplatesImpl.TransletClassLoader.defineClass()
											Pwner*(Javassist-generated).<static init>
												Runtime.exec()

Java-CommonsBeanutils1利用链分析

首先PriorityQueue 是使用数组实现的完全二叉树优先队列,不允许空值,而且不支持 non-comparable 的对象。由于TemplatesImpl 未实现 Comparable 接口,为了绕过这个,可以看到代码当中首先添加了两个 BigInteger 值为1的对象。BeanComparator 中设置的比较属性为 lowestSetBit,这里也可以改为 BigInteger 其它的可比较属性名称,之后,利用 Java 反射机制将 Comparator的property 设置为 TemplatesImpl 的属性 outputProperties,但是这个属性在这里未起到比较的作用。它的重要作用将在 payload 反序列化时体现。
而PropertyUtils.getProperty 这个方法会自动去调用一个JavaBean的getter方法,
这个点是任意代码执行的关键
还记得之前我跟的TemplatesImpl调用newTransfer执行字节码了么

TemplatesImpl#newTransformer() -> TemplatesImpl#getTransletInstance() -> TemplatesImpl#defineTransletClasses() -> TransletClassLoader#defineClass()

我们再往前看TemplatesImpl#getOutputProperties(),作用域是public,可以被外部调用

这时候我们就要配合使用BeanComparator
BeanComparatorcommons-beanutils提供的用来比较两个JavaBean是否相等的类,其实现了java.util.Comparator接口
下面来跟一波调用流程

继续

继续

BeanComparatorcompare方法


后面其实没啥好说的,前面我的文章已经分析过很多次TemplatesImpl的加载字节码的过程


通过getOutputProperties调用newTransformer实现我们后面的步骤

分析大致结束Payload可以看参考文章,也可以直接使用ysoserial

参考文章

Java 反序列化之 CommonsBeanUtils 分析

以上是关于[Java反序列化]Java-CommonsBeanutils1利用链分析的主要内容,如果未能解决你的问题,请参考以下文章

什么是java的序列化和反序列化?

Java序列化与反序列化

Java序列化与反序列化

Java序列化与反序列化

java 对象序列化与反序列化

Java序列化与反序列化