Java代码审计——Commons Collections5 BadAttributeValueExpException

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

0x00 前言

反序列化总纲
cc链无非就是不同的调用拼接在一起形成的,比如cc5就是在cc1的基础上进行调用调整的。

0x01 BadAttributeValueExpException

在LazyMap的基础上,发现了一个新的调用方式,就是通过 TiedMapEntry+BadAttributeValueExpException的方式进行调用的。

在之前,我们知道LazyMap需要调用get方法才可以触发,那么我们的主题就是如果去触发LazyMap的get方法。

1.TiedMapEntry

首先来看这个类的构造方法。
可以看到存储了一个Map对象
Java代码审计——Commons Collections5 BadAttributeValueExpException
然后找此类中调用map.get的地方
Java代码审计——Commons Collections5 BadAttributeValueExpException
然后继续找getValue的地方,可以看到三个方法equals,hashcode,toString
Java代码审计——Commons Collections5 BadAttributeValueExpException
那么也就是说只要找到一个类的readObject中可以触发这四个方法就可以续上我们的LazyMap。

2.BadAttributeValueExpException

来看这个类的readObject方法,可以看到toString的方法

Java代码审计——Commons Collections5 BadAttributeValueExpException
要想执行到toString方法,那么val就不能为空,所以我们需要对val进行一个赋值。

poc:

Field valfield = val.getClass().getDeclaredField("val");
      Reflections.setAccessible(valfield);
valfield.set(val, entry);

当val有值了之后就会触发toString方法,就会走到TiedMapEntry,然后调用LazyMap的get方法,然后走迭代链或者其迭代链。

0x03 使用条件

  • 除最新版本无限制

0x04 要点笔记

  • 通过TiedMapEntry包裹LazyMap
  • 通过BadAttributeValueExpException调用toString方法

补充知识

Commons Collections

Apache Commons Collections 是一个为 Java 提供扩展集合类的开源项目。它提供了一系列有用的集合类和算法,可以使编程变得更加简单,快捷和高效。该项目的目标是提供一系列可重用的集合类和算法,以便更好地支持 Java 语言的开发。这些集合类和算法采用了可扩展的方式,方便对其进行定制和扩展。一些常用的集合类包括:List, Set, Map, Stack, Queue 等。Commons Collections 还提供了一些实用的算法,例如排序,查找,迭代等。该项目还提供了一些工具类,用于操作集合和其它数据结构。该项目的目标是成为一个高质量,高性能,易于使用的集合类库。

Commons Collections优势

Commons Collections 是一个 Java 库,它提供了许多常用的数据结构和算法实现,使 Java 开发人员能够更轻松地处理集合和映射等数据结构。以下是 Commons Collections 的优势:

  1. 丰富的数据结构:Commons Collections 支持多种数据结构,包括列表、双向列表、集、双端队列、堆、栈、树、位集等,这些实现了大部分开发人员所需的数据结构。

  2. 操作灵活方便:Commons Collections 提供了丰富的操作方法,如排序、查找、遍历、过滤、转换、合并等,这些方法可以方便地处理数据结构。

  3. 支持自定义:Commons Collections 通过接口或抽象类提供了多样的接口,以便用户可以自定义数据结构的实现。

  4. 可扩展性强:Commons Collections 可以与其他开源库和框架进行集成,如 Guava、Spring Framework、Hibernate 等。

  5. 文档详尽:Commons Collections 提供了详尽的文档和示例,开发人员可以很容易地学习和使用该库。

  6. 开发活跃:Apache Commons 是 Apache 组织下的一个开源项目,其开发和维护都非常活跃。作为 Commons Collections 的一部分,其代码质量和稳定性得到了保证。

序列化和反序列化

Java 序列化是将 Java 对象转换为字节流的过程,以便在网络上传输或者将对象保存到磁盘文件中。Java 反序列化则是将字节流反转回 Java 对象的过程,以便在程序中使用这些对象。

Java 序列化和反序列化的过程使用 ObjectOutputStreamObjectInputStream 这两个类来实现。序列化过程中,将需要序列化的对象写入 ObjectOutputStream 中,并通过网络或文件等途径传输或保存,反序列化过程中则将字节流读入 ObjectInputStream 中,并通过类型转换得到原始对象。

需要注意的是,在进行序列化和反序列化时,对象所对应的类需要实现 Java 序列化接口 Serializable,否则会抛出序列化异常。同时,在进行序列化时,对于敏感信息,需要进行加密或者采用其他安全措施。

序列化栗子

下面是一个简单的 Java 序列化例子:

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {

        // 创建一个对象
        Person person = new Person("Alice", 25);

        // 将对象序列化到文件
        try {
            FileOutputStream fileOut = new FileOutputStream("person.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(person);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in person.ser");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从文件读取序列化的对象
        try {
            FileInputStream fileIn = new FileInputStream("person.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            Person deserializedPerson = (Person) in.readObject();
            in.close();
            fileIn.close();
            System.out.println("Deserialized data:");
            System.out.println("Name: " + deserializedPerson.getName());
            System.out.println("Age: " + deserializedPerson.getAge());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

// 可序列化的类
class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

运行程序后,会在当前目录下创建一个名为 person.ser 的文件,里面保存着序列化后的对象。然后程序从文件中读取序列化的对象,将其反序列化成一个 Person 对象,最后输出这个对象的属性。

Java代码审计学习方法

以下是Java代码审计学习方法的一些建议:

  1. 了解Java编程基础:在开始进行Java代码审计之前,需要掌握Java编程的基础知识,了解Java的语法,数据类型,控制流程等基本概念。

  2. 学习安全知识:了解常见的Web攻击类型,例如SQL注入、跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等。

  3. 学习常见漏洞:学习已知的安全漏洞,理解攻击者利用这些漏洞的方法,例如未经验证的输入、代码注入和文件包含漏洞等。

  4. 寻找样例代码:一些开源的应用程序或框架可以用来学习Java代码审计,例如WordPress、Joomla和Struts等。通过分析这些代码,可以了解常见的安全问题和漏洞。

  5. 学习使用辅助工具:使用一些代码审计工具,例如FindBugs、SonarQube和Parasoft等,可以帮助发现代码中的错误和漏洞。

  6. 实践漏洞挖掘:通过实践,寻找一些样例代码中的漏洞,例如通过手动构造攻击向量,测试应用程序的安全性。

  7. 学习修复漏洞:理解漏洞修复的方法,例如安装补丁、更新库或修复代码中的错误。学习如何编写安全的代码,通过遵循安全编码实践来避免漏洞的产生。

Java代码审计需要对Java编程基础、Web安全、常见漏洞和修复方法等知识有充分的了解。通过实践和使用工具,可以提高对代码中漏洞的发现和修复能力。文章来源地址https://www.toymoban.com/news/detail-415464.html

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

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

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

相关文章

  • Java代码审计

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

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

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

    2024年02月15日
    浏览(44)
  • 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日
    浏览(60)
  • java代码审计之SQL注入漏洞

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

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

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

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

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

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

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

    2024年01月16日
    浏览(38)
  • 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日
    浏览(44)
  • 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日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包