Java 反序列化历程穷究 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Java 反序列化历程穷究

申博_人物事迹 申博 212次浏览 未收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

0x01 原由

    关于Java反序列化的文章已相称的多了,而且人人也关于这个器械说的很清晰了,以是往年我想换个角度来看看这个器械。我们都晓得Java反序列化破绽的发生缘由在于开发者在重写 readObject 要领的时刻,写入了破绽代码,这个和PHP的反序列化破绽很像,在反序列化的时刻出发了在 __destruct 等把戏函数中的破绽代码。这里就有一个题目了,先看一下我的demo吧, ObjectCalc.java 为重写 readobject 要领文件。
Java 反序列化历程穷究
    那末我经由历程下面的代码能够触发反序列化破绽,弹出计算器。
Java 反序列化历程穷究
    那末题目来了我们经由历程 第8行 ois.readObject 获取到的输入流历程当中挪用了 readObject 要领,为何末了会挪用到被反序列化类( ObjectCalc )中的 readObject 要领,这个 readObject 挪用历程究竟是怎样的。

0x02 深入分析

    为了弄清晰这个题目,我决定在 ObjectCalc.java 文件中的敕令实行地位下一个断点,好的相干挪用栈已出来了,这时刻我们跟进一下。
Java 反序列化历程穷究
    先跟进一下 ObjectInputStream.readObject ,这里我简化了一下代码,症结地位在 第431行 挪用了 readObject0 要领,而且传入false。
Java 反序列化历程穷究
    继承跟进一下 readObject0 要领,症结在下面这两行,此时的 TC_OBJECT 的值为115,且挪用了 readOrdinaryObject 要领。

case TC_OBJECT:
    return checkResolve(readOrdinaryObject(unshared));

    跟进 readOrdinaryObject 要领,挪用了 readSerialData 要领。

某开源碉堡机的数据库默许暗码及iptables接见限定绕过

这是比较久之前发现的问题了,官方已经知晓,这么长的周期下应该也已经修复了,这个堡垒机号称是开源的堡垒机吧,只要下载ISO直接安装就行,自带系统,默认已经有配置了,我测试的也主要是默认配置这种情况下的堡垒机,堡垒机的系统我们

private Object readOrdinaryObject(boolean unshared)
        throws IOException
    {
 ...
        if (desc.isExternalizable()) {
            readExternalData((Externalizable) obj, desc);
        } else {
            readSerialData(obj, desc);
        }

    继承跟进一下 readSerialData 要领,该要领的完成以下所示。
Java 反序列化历程穷究
    从动态调试效果来看,重写 readObject 会进入第14行的 slotDesc.invokeReadObject 要领中,再跟进一下 slotDesc.invokeReadObject 要领,该要领重要代码以下:

void invokeReadObject(Object obj, ObjectInputStream in)
        throws ClassNotFoundException, IOException,
               UnsupportedOperationException
    {
        requireInitialized();
        if (readObjectMethod != null) {
            try {
                readObjectMethod.invoke(obj, new Object[]{ in });

    个中 readObjectMethod.invoke 这个要领很熟悉了,java的反射机制,也就说经由历程重写 readObject 的全部挪用流程会进过java的反射机制。
    这里再看一个不经由历程重写 readObject 反序列化的挪用历程,我省略了前面的跟踪调试历程,人人看下图。
Java 反序列化历程穷究
    不经由历程重写 readObject 的反序列化历程一样是进入 readSerialData 中,然则是经由历程 defaultReadFields 举行处置惩罚,这里有个关注点是 slotDesc.hasReadObjectMethod() 返回的效果是false,也就是下面这个if推断的效果,我简化了一下流程。

else if (slotDesc.hasReadObjectMethod()) {
    slotDesc.invokeReadObject(obj, this);
    ...
    } else {
    defaultReadFields(obj, slotDesc);
    }

    也就是说实际上是不是重写了 readObject 影响的是 slotDesc.hasReadObjectMethod() 的效果,那末跟进一下 hasReadObjectMethod 要领,这里我在return (readObjectMethod != null);下了一个断点,对照一下重写 readObject 效果和不重写 readObject 效果的差异,第一张图是不重写 readObject ,第二张图是重写 readObject
Java 反序列化历程穷究
Java 反序列化历程穷究
    很明显我们发现了返回效果不一样,第一张图的效果天然return为false,第二张图return效果天然为true,也就是说重写 readObject 效果和不重写 readObject 效果的差异本质上在于进入的轮回不一样。

0x03 小结

    依据上面的动态调试效果,简朴做个小结,也就是说若是反序列化的历程当中被反序列化类重写了 readObject ,该数据在反序列化的历程当中中心流程走到 readSerialData 要领中的 slotDesc.invokeReadObject 要领,经由历程反射机制触发相干流程,而且挪用重写的 readObject 。若是没有重写 readObject ,则挪用 ObjectInputStream 类中的 readObject 要领,而且实行反序列化。

minhook源码浏览剖析

minhook源码阅读分析 minhook是一个inline Hook的库,同时支持x32和x64系统,并且是开源的,地址在这里https://www.codeproject.com/Articles/44326/MinHook-The-Minimalistic-x-x-API-Hooking-Libra。下面就简单的分析一下它的工作过程


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Java 反序列化历程穷究
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址