写在前面 Hibernate是深究一个开源免费的、基于 ORM 技术的架下 Java 持久化框架
。通俗地说,深究Hibernate 是架下一个用来连接和操作数据库的 Java 框架 ,它最大的深究优点是使用了 ORM 技术。 Hibernate 支持几乎所有主流的架下关系型数据库
,只要在配置文件中设置好当前正在使用的深究数据库,程序员就不需要操心不同数据库之间的亿华云架下差异 。 对于Hibernate框架的深究反序列化链主要是通过调用了任意的getter方法
,结合TemplatesImpl这条链子进行利用链的架下构造。 在该框架中存在有org.hibernate.property.PropertyAccessor这个接口 我们从这个注释可以知道,深究定义了一个类的架下属性值的相关策略 在接口中的定义了两个方法,分别为getGettergetSetter方法 该接口的深究实现类是BasicPropertyAccessor 定义了两个实现类BasicGetter/ BasicSetter 主要来看看BasicGetter类 首先 ,在其构造方法中传入了三个参数,源码库架下分别是深究目标类
,目标方法,目标属性。 同时关注get方法的实现,将会触发目标的method方法
,这里就是漏洞点。 那么这个Getter又是从何而来的呢? 我们可以关注到BasciPropertyAccessor类对getSetter方法的重写 在getSetter方法中将会调用createGetter方法
,进而调用了getGetterOrNull方法。 在该方法中,免费模板将会通过getterMethod方法得到对应属性的getter方法名,如果存在的话,将会将其封装为BasicGetter对象进行返回 。 那我们跟进一下getterMethod方法 首先在该方法中将会调用theClass.getDeclaredMethods方法得到目标类的所有存在的方法
,之后遍历这些方法,如果该方法参数个数不为零就跳过,获取方法返回Bridge也会跳过
,之后在获取该方法名之后
,判断是否是get开头,如果是服务器租用




