Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 渗透分析 › 「渗透分析」GadgetInspector改造中反序列化三个source点的原理分析

「渗透分析」GadgetInspector改造中反序列化三个source点的原理分析

Eswlnk的头像
Eswlnk
2022-12-23 16:55:45
「渗透分析」GadgetInspector改造中反序列化三个source点的原理分析-Eswlnk Blog
智能摘要 AI
本文探讨了Java反序列化漏洞中的关键方法调用原理,重点分析了`readObject`、`readResolve`和`readExternal`三个方法。文中通过创建`Test1`(实现`Serializable`接口)、`Test2`(实现`Externalizable`接口)和`Test`类,展示了这些方法在序列化和反序列化过程中的作用。`readObject`用于反序列化普通对象,`readResolve`用于替代反序列化后的对象,`readExternal`则用于自定义外部化数据的读取。通过对这些方法的深入剖析,作者指出自动化工具可以通过模糊匹配实现上述接口并包含相应方法的类,作为构建Gadget链的源点,从而有效挖掘反序列化漏洞。

前言

在改造自动化Gadget挖掘的过程中,在收集各种source / sink的时候,针对反序列化漏洞的source存在有readObject / readResolve / readExternal,这里就是对其调用的原理进行详细探究

原理分析

环境

我们这里创建了三个类Test1 / Test2 / Test

其中Test1类,是一个实现了Serializable接口,并定义了readObject / readResolve两个方法

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Test1 implements Serializable {

    private Object readResolve() {
        System.out.println("readResolve.....");
        return new Test1();
    }
    private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException {
        inputStream.defaultReadObject();
        System.out.println("readObject.....");
    }
}

其中Test2类,是一个实现了Externalizable接口,并重写了writeExternal / readExternal两个方法

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Test2 implements Externalizable {
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        System.out.println("writeExternal.....");
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        System.out.println("readExternal....");
    }
}

而其中的Test类,是一个进行类的序列化和反序列化调用的类

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {
    public static void main(String[] args) throws Exception{
        Test1 test1 = new Test1();
        Test2 test2 = new Test2();

        // serialization
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(test1);
        byte[] bytes = byteArrayOutputStream.toByteArray();

        // deserialization
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        objectInputStream.readObject();

        System.gc();
    }
}

readObject调用

在反序列化的过程中,将会调用ObjectInputStream#readObject方法进行反序列化

这里首先将会调用readObject0方法来执行核心的反序列化的逻辑

这个方法就是底层反序列化的实现,主要的逻辑就是通过tc的值进行不同的方法调用

那这个tc值是从哪里来的呢?

从1540行代码中可以知道,是从bin这个数据块输入流(BlockDataInputStream)获取的字节,也即是获取的是TC_OBJECT的值,十进制数为115

进入case语句中,调用readOrdinaryObject方法进行反序列化核心逻辑

之后调用了readClassDesc方法,通过读取类描述符来进行不同的操作,也即是TC_CLASSDESC

这里的得到的值为114,进入的case语句为:

调用了readNonProxyDesc方法读入并返回不是动态代理类的类的类描述符,也即是真正的处理类描述符

首先是从流中读取了类描述

之后调用了resolveClass方法进行目标类的创建

其中是通过Class.forName来加载对应的类并返回

之后将得到的这个类传入了initNonProxy方法中

将前面得到的类传递给了desc对象中,最后直到readClassDesc的逻辑完成

现在回到了readOrdinaryObject方法中

这里首先将前面得到的类实例化得到obj对象

在后面存在有一个判断,通过调用isExternalizable方法判断是否实现了Externalizable这个接口

这里我们在Test1类中并没有实现这个接口,所以我们这里进入的是else子句中调用了readSerialData进行序列化数据的反序列化操作

这个方法中也即是我们的source点的调用位置

这里首先获取了序列化的类数据之后,通过遍历这个序列化的类,存在判断其类中是否存在有readObject方法

通过hasReadObjectMethod方法进行实现

之后在第二个箭头处,将会通过反射来调用这个readObject方法的逻辑

调用栈:

readObject:14, Test1 (pers.test_01)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invokeReadObject:1170, ObjectStreamClass (java.io)
readSerialData:2178, ObjectInputStream (java.io)
readOrdinaryObject:2069, ObjectInputStream (java.io)
readObject0:1573, ObjectInputStream (java.io)
readObject:431, ObjectInputStream (java.io)

readResolve调用

接着前面通过反射调用了序列化类的readObject方法,在readOrdinaryObject方法中接着往下走

在调用完readSerialData方法之后,接着会通过调用hasReadResolveMethod方法来判断序列化类是否存在有readResolve方法

如果存在,将会反射调用该方法

readExternal调用

对于该方法的调用,必须要求序列化类实现了Externalizable接口,所以我们这里转而对Test2进行序列化和反序列化调用

前面的一大部分过程和readObject的调用类似,这里和前面不同的点在于在进行isExternalizable方法调用进行判断的时候

前面是进入的readSerialData方法进行序列化数据的反序列化操作

这里转而使用readExternalData方法进行序列化数据的反序列化操作

如果目标类不为空,将会直接调用readExternal方法进行外部化数据的读取,进而达到了我们的source的条件

总结

前面详细的分析了可以作为反序列化source点的三个方法,对于自动化工具来说,完全可以采取模糊匹配的方式,即是直接筛选实现了Serialiable接口且存在有这三个方法的任一个方法的类作为我们Gadget链的source点

本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
序列化
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
Pentesting MSSQL | Microsoft SQL Server
上一篇
「渗透分析」通过 3 个简单步骤完全拥有一家航空公司
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「漏洞资讯」CVE-2025-12914:宝塔面板曝出注入漏洞
  • 「渗透分析」如何防范JS注入?nbcio-boot代码审计攻略大公开
  • 「漏洞资讯」多用户管理系统API接口调用存在前台SQL注入漏洞(0day)
  • 「漏洞资讯」1Panel面板前台RCE漏洞(CVE-2024-39911)
  • 「高危漏洞」xz 和 liblzma 5.6.0~5.6.1 被植入后门,威胁所有 x64 架构 Linux 和 macOS 用户
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

深入浅出”P牛”版CC1链
2022-03-27 22:32:25
广东电信网络崩溃的原因究竟是什么?
2023-06-09 0:35:15
Linux内核存在条件竞争漏洞 | 黑客可获取root权限
2023-07-26 21:47:16

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.863 秒   |  SQL查询 39 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈