反序列化漏洞3之java序列化与反序列化

一、Java反序列化漏洞
1. 反序列化漏洞概述
  • 定义: 反序列化漏洞是一种在多种编程语言中存在的典型漏洞,特别是在JAVA中。
  • 特点: 不同的编程语言具体的利用细节和影响的范围不一样,但概念类似。
2. Vulhub平台介绍
  • 定义: Vulhub是一个国产的靶场平台,收集了众多中间件漏洞。
  • 功能: 支持一键搭建漏洞测试靶场,方便进行漏洞研究和复现。
  • 漏洞数量: 目前大概有100多个漏洞,其中反序列化的漏洞就有20多个。
  • 使用方式: 通过docker-compose up -d命令启动漏洞环境。
3. Apache ActiveMQ反序列化漏洞
  • 漏洞编号: CVE-2015-5254
  • 漏洞描述: Apache ActiveMQ 5.x版本(5.13.0之前)存在安全漏洞,由于程序未限制可序列化的类,导致远程攻击者可以构造特殊的Java消息服务(JMS)ObjectMessage对象,利用此漏洞执行任意代码。
  • 影响范围: 广泛影响使用Apache ActiveMQ的应用系统。
4. 反序列化漏洞的重要性
  • 出现频率: 反序列化漏洞在各类漏洞中出现的频率非常高,说明其具有重要的安全威胁。
  • 防范难度: 由于反序列化操作的复杂性和多样性,防范此类漏洞具有一定的难度。
5. 实战应用与防范建议
  • 实战应用: 在实际的攻防演练中,可以利用反序列化漏洞进行渗透测试,发现系统的安全隐患。
  • 防范建议:
    • 对序列化和反序列化的数据进行严格的校验和限制。
    • 使用安全的序列化机制,如Kryo、JSON等。
    • 定期更新和修补相关软件和库,以修复已知的安全漏洞。
    • 加强系统的安全监控和日志审计,及时发现并处置异常行为。
二、学习建议与JAVA反序列化漏洞
1. 学习建议
  • 学习PHP反序列化漏洞:
  • 学习其他组件的反序列化漏洞,还可以继续学习如tomcat等其他组件的反序列化漏洞。
2. JAVA反序列化漏洞介绍
  • 课程重点: 本节课将讲解JAVA的反序列化漏洞。
  • 预警: 老师提醒,由于是直播讲解,代码环境虽已测试,但仍有可能出现意外,若直播时出现问题,希望同学们理解。
  • 学习目的: 主要是学习漏洞的流程和思想,而不仅仅是具体的代码实现。
3. 反序列化漏洞的重要性
  • 重要性: 反序列化漏洞是安全领域中的一个重要问题,了解并掌握其原理和利用方式对于提高系统的安全性至关重要。
  • 扩展学习: 鼓励同学们在课程之外,继续深入学习其他相关组件和技术的反序列化漏洞,以全面提升自己的安全技能。
三、基础环境
1. Java开发环境
  • JDK: 包含Java运行时环境(JRE),用于运行Java代码。
  • IDEA: 最流行的Java开发工具。
  • Maven: 用于管理jar包依赖,替代手工导入依赖的方式。
2. 服务器与工具
  • Tomcat: 本地HTTP服务器,用于运行Java Web工程。
  • Burp Suite: 用于发送HTTP请求,进行Web安全测试。
  • Kali: 渗透测试操作系统,包含渗透相关工具,用于启动渗透程序。
3. 环境配置
1)Maven配置
  • 配置方法: 下载Maven工具包并配置环境变量即可使用。
2)Kali系统安装与配置
  • 学习资料: 教程合集中包含Kali系统的下载、配置及远程连接方法。
4. 课程资料
  • 资料获取: 相关资料将上传至课程资料中,方便学生下载学习。
四、反序列化漏洞概述
1. 总体规划
  • 总体规划: 四种重要的反序列化漏洞,包括Java反序列化漏洞、Apache Commons Collections反序列化漏洞、Alibaba Fastjson反序列化漏洞和Apache Shiro反序列化漏洞。
2. Java反序列化漏洞介绍
  • Java反序列化漏洞: 是指当Java应用程序在反序列化不可信数据时,可能会引发安全漏洞,导致远程代码执行或敏感信息泄露。
  • 产生原因: 序列化和反序列化过程中,如果未对输入数据进行严格校验,恶意攻击者可以构造恶意数据,导致反序列化时执行恶意代码。
3. 序列化和反序列化的含义与用途
  • 序列化: 将对象转换为字节流的过程,便于网络传输或持久化存储。
  • 反序列化: 将字节流转换回对象的过程,恢复对象的状态。
  • 用途: 在分布式系统、远程调用、持久化存储等场景中广泛应用。
4. 反序列化漏洞的出现
  • 出现情况: 反序列化漏洞通常出现在处理不可信输入时,如从网络接收数据、读取恶意文件等。
  • 漏洞利用: 攻击者可以构造特殊的字节流,使得反序列化时执行恶意代码,如远程代码执行、权限提升等。
5. Apache Commons Collections反序列化漏洞
  • 漏洞简介: Apache Commons Collections库中的反序列化功能存在漏洞,允许攻击者构造恶意数据执行任意代码。
  • 影响力: 该漏洞影响力广泛,被多次利用于实际攻击中。
6. Alibaba Fastjson反序列化漏洞
  • 漏洞简介: Fastjson是一个Java库,用于将Java对象转换成JSON格式的字符串,或将JSON字符串转换成Java对象。其反序列化功能存在漏洞。
  • 漏洞利用: 攻击者可以构造恶意的JSON数据,导致反序列化时执行恶意代码。
7. Apache Shiro反序列化漏洞
  • 漏洞简介: Apache Shiro是一个安全框架,用于身份验证、授权等。其反序列化功能存在漏洞,允许攻击者进行远程代码执行。
  • 影响力: 该漏洞在多个版本中存在,对使用Shiro的应用构成严重威胁。
五、序列化和反序列化的含义和用途
1. 序列化
1)序列化主要使用场景
  • 持久化内存数据: 将内存中的数据保存到磁盘,以便在服务器重启或程序退出后仍能恢复数据。例如,Web应用中的用户会话信息在服务器重启后需要恢复,就可以通过序列化将会话数据保存到磁盘。
  • 网络传输对象: 在分布式系统中,不同服务之间需要传输对象数据,序列化可以将对象转换为二进制流或字符串,通过网络传输到目标服务,目标服务再通过反序列化还原对象。
  • 远程方法调用(RMI): Java的远程方法调用机制也依赖于序列化,通过序列化传输方法调用所需的参数和返回值。
2. PHP反序列化
  • PHP对象序列化: PHP对象序列化后的数据包含类名长度、类名、对象属性个数、属性名长度、属性值等内容,这些数据通常以明文字符串的形式存在,肉眼可读。
3. JSON格式
  • 数据交换格式: JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。与XML相比,JSON更加简洁,没有那么多冗余的标签。
  • 结构: JSON数据由键值对组成,支持嵌套数组和复杂数据结构。例如,一个包含用户信息的JSON对象可以包含用户的姓名、年龄、性别、地址等字段,地址字段又可以是一个包含多个地址信息的数组。
4. 序列化和反序列化演示
  • 序列化过程:
    • 创建一个Person对象,设置其姓名和年龄。
    • 使用ObjectOutputStream将Person对象写入文件,完成序列化。
  • 反序列化过程:
    • 使用ObjectInputStream从文件中读取二进制流,还原为Person对象。
    • 调用Person对象的getName和getAge方法,验证反序列化结果。
  • 注意:
    • 序列化和反序列化的对象必须实现Serializable接口。
    • 如果序列化和反序列化发生在不同的包或项目中,需要确保反序列化端有对应类的定义或依赖。
六、反序列化漏洞的出现
1. 反序列化漏洞的产生
  • 反序列化漏洞位置: 反序列化漏洞主要出现在readObject方法中。
  • 产生原因: 在反序列化过程中,如果对象类重写了readObject方法,并且该方法中包含可执行的敏感操作,同时其参数可被控制,就可能引发反序列化漏洞。
2. readObject方法的自定义



  • 自定义可能性: readObject方法可以在类中自定义,不论是JDK自带的类还是用户自定义的类。
  • 自定义内容: 自定义内容可以包含执行命令等敏感操作,如示例中的Runtime.getRuntime().exec("calc.exe")。
3. 漏洞利用示例
  • 示例类: UnsafeClass类重写了readObject方法,并在其中执行了打开计算器的命令。
  • 漏洞利用: 在反序列化UnsafeClass对象时,会调用自定义的readObject方法,从而执行恶意代码。
4. 漏洞验证
  • 验证过程: 创建UnsafeClass对象,赋值后进行序列化和反序列化,如果反序列化过程中计算器被打开,则证明存在反序列化漏洞。
  • 验证结果: 计算器被打开,说明反序列化漏洞存在。
5. 漏洞利用条件
  • 条件一: 目标服务器必须存在被攻击的类。
  • 条件二: 被攻击的类必须重写了readObject方法,并且方法中包含可执行的敏感操作。
  • 条件三: 攻击者需要能够控制反序列化过程中的参数。
6. 现有重写readObject的类
  • 现有类: 经过大牛们的努力,找到了一些重写了readObject方法的现成类,如AnnotationInvocationHandler和BadAttributeValueExpException。
  • 包名: 这些类的包名分别为sun.reflect.annotation和javax.management。
7. 利用思路
  • 利用自定义readObject: 通过自定义的readObject方法执行恶意代码。
  • 寻找重写类: 寻找那些已经重写了readObject方法的类,并检查其方法内容是否满足利用条件。
  • 整体介绍: JAVA反序列化漏洞的整体介绍,包括漏洞的产生、利用方式及现有可利用的类。
  • 典型利用: 接下来将通过一个典型的利用案例,展示如何使用找到的AnnotationInvocationHandler类来实现执行恶意代码的反序列化漏洞。
七、知识小结

知识点

核心内容

考试重点/易混淆点

难度系数

JAVA反序列化漏洞

概念、产生原因、利用方式

反序列化漏洞的产生原因、利用细节

序列化和反序列化

定义、用途、实现方式

序列化和反序列化的区别、实现细节

JDK序列化工具

ObjectOutputStream、ObjectInputStream

序列化方法(writeObject)、反序列化方法(readObject)

反序列化漏洞利用

通过重写readObject方法执行恶意代码

重写readObject方法的风险、恶意代码执行条件

典型漏洞案例

Apache Common Collections(CC)反序列化漏洞

CC漏洞的影响、利用方式

数据交换格式

JSON、XML等

JSON与XML的优缺点、适用场景

靶场平台

VulHub

VulHub的功能、漏洞数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值