Spring RMI反序列化漏洞分析

概况

漏洞的入口在于Spring-tx-xxx.jar中的JtaTransactionManager重写了ReadObject方法,该方法中的UserTransactionName可控,且初始化UserTransactionName的时候调用了Jndi的lookup方法,导致 Jndi注入的问题。

ReadObject流程

首先是重写的ReadObject函数

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
   
    ois.defaultReadObject();
    this.jndiTemplate = new JndiTemplate();
    this.initUserTransactionAndTransactionManager();
    this.initTransactionSynchronizationRegistry();
}

跟入initUserTransactionAndTransactionManager()函数
该函数的作用为初始化UserTransactionName和TransactionManger

protected void initUserTransactionAndTransactionManager() throws TransactionSystemException {
   
    if (this.userTransaction == null) {
   
        if (StringUtils.hasLength(this.userTransactionName)) {
   
            this.userTransaction = this.lookupUserTransaction(this.userTransactionName);
            this.userTransactionObtainedFromJndi = true;
        } else {
   
            this.userTransaction = this.retrieveUserTransaction();
            if (this.userTransaction == null && this.autodetectUserTransaction) {
   
                this.userTransaction = this.findUserTransaction();
            }
        }
    }

从代码中可以看出如果传入的UserTransactionName不为空则会调用lookupUserTransaction,函数的作用为通过Jndi地址去寻找UserTransaction实例

protected UserTransaction lookupUserTransaction(String userTransactionName) throws TransactionSystemException {
   
    try {
   
        if (this
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值