触发点在
com.mysql.cj.jdbc.result.ResultSetImpl.getObject()




可以看到在触发readObject之前还对data的前两个字节进行了比较来判断是不是序列化对象,-84,-19,这里就派上用处了。

接下来就是正常的找链环节了,找哪里调用了
getObject,找到
com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor.populateMapWithSessionStatusValues()




跟进
resultSetToMap,到此链子就结束了,有点小短(




现在的问题是找rs,toPopulate,上面可以看到
rs = stmt.executeQuery("SHOW SESSION STATUS");,rs其实是这个sql语句的返回值,如果我们能控制一个恶意mysql服务端,岂不是就能控制这条sql语句的返回值了,这样rs也就能控制了,这样就能反序列化了。

注意getObject这里有个if判断,这个
autoDeserialize的value值得是true,才能进入