写在前面 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开头
,如果是免费模板




