Skip to content
blogs of mekrina
Go back

其他一些反序列化

Updated:
Edit page

Rome

堆栈

TemplatesImpl.getOutputProperties
at com.sun.syndication.feed.impl.ToStringBean.toString
at com.sun.syndication.feed.impl.EqualsBean.beanHashCode
at java.util.HashMap.hash
at java.util.HashMap.readObject

对象图

hashmap
	key = equalsBean
		_obj = toStringBean
			_beanClass = TemplatesImpl.class
			_obj = templatesImpl

EqualsBean#hashCode -> EqualsBean#beanHashCode -> ToStringBean#toString

image-20260808225013909

ToStringBean的toString方法会在_obj上反射调用_beanClass上的getter方法

image-20260808224857723

配合TemplateImpl#getOutputProperties实现字节码加载

Jackson

依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

spring-boot-starter-web中自带这个。因此在springboot应用中可以用这个调用getter。

 badAttribute... # readObject
 POJONode # toString
 InternalNodeMapper # nodeToString
 ObjectWriter # writeValueAsString (templates)
 proxy.invoke ...
 TemplatesImpl # getOutputProperties

使用org.springframework.aop.framework.JdkDynamicAopProxy来解决getter调用顺序不固定导致的不稳定问题。由于Template类(TemplateImpl的接口)只有getOutputProperties这一个getter,用JdkDynamicAopProxy代理这个接口类,代理对象是TemplateImpl类实例。

Spring-boot

springboot内置库的反序列化


Edit page