Ysoserial改造记录

💡 原文中文,约5400字,阅读约需13分钟。
📝

内容提要

本文介绍对ysoserial工具的改造,核心是自定义ClassLoader实现不同版本jar包隔离加载,以解决Shiro反序列化漏洞利用中的版本冲突问题。改造后支持五种命令执行方式,并大幅减小payload体积,去除原版特征字段,提升隐蔽性。

🔎

延伸解读

自定义ClassLoader隔离加载的原理

文章通过将自定义ClassLoader的parent设为null,并重写findClass方法,实现了不同版本jar包的隔离加载。这种设计避免了双亲委托模型导致的类冲突,使得在同一个JVM中能够同时加载多个版本的库,从而解决Shiro反序列化利用中的版本兼容问题。理解这一机制有助于在类似场景中灵活处理依赖冲突。

payload体积优化与特征去除

改造后的工具显著减小了payload体积,并移除了原版ysoserial的特征字段(如包名改为dogeser),增强了隐蔽性。这提醒我们,在安全测试中,payload的大小和特征往往影响检测规避效果,合理优化能提升攻击或测试的成功率。

多种命令执行方式的选择

工具支持五种命令执行方式,包括直接命令、代码字符串、Base64编码代码、代码文件路径和class文件路径。这种设计提供了灵活性,可根据代码长度和特殊字符情况选择合适的方式,避免命令行转义问题。实际使用时需注意不同方式的适用场景和限制。

Q&A

ysoserial改造中如何解决不同版本jar包的冲突问题?

通过自定义ClassLoader(StandardExecutorClassLoader)实现不同版本jar包的隔离加载。该ClassLoader的parent设为null,并重写findClass方法,在找不到类时委托给系统ClassLoader,从而避免与启动项目的类加载器冲突,实现版本隔离。

为什么自定义ClassLoader的parent要设置为null?

根据双亲委托模型,如果parent不为null,类加载请求会先委托给父加载器,可能导致加载到启动项目的类,无法实现隔离。设置为null后,自定义ClassLoader不会委托给App ClassLoader,从而保证加载的类与启动项目完全隔离。

ysoserial改造后支持哪些命令执行方式?

支持五种方式:1. command(原版命令执行);2. code:代码内容(代码量少时);3. codebase64:代码内容base64编码(防止特殊字符冲突);4. codefile:代码文件路径(代码量多时);5. classfile:class路径(直接使用已编译的class字节码)。

如何减小ysoserial生成的payload体积?

通过参考相关文章,对生成payload的方法进行改造,最大程度减小payload体积,对比结果直接减小一半多。具体方法未在文中详述,但改造后体积显著减小。

ysoserial改造后如何去除原版特征字段?

将原版的package名字改为dogeser,并去除原版大量使用的ysoserial、Pwer字段,从而生成的payload中不会出现ysoserial字段,提升隐蔽性。

使用classfile方式执行代码时,类需要满足什么条件?

类需要继承AbstractTranslet,并且需要使用JDK内置的AbstractTranslet(如com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet),而不是外部jar包中的版本。

🏷️

标签

➡️

继续阅读