从代码看Java反序列化漏洞

admin 2025年4月22日23:50:35评论6 views字数 1685阅读5分37秒阅读模式

声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。

请大家关注公众号支持,不定期有宠粉福利

Part-01

    基础知识

  Java 是面向对象编程的,当你想把某个对象存储起来以便长期使用时,便需要用到 Java 反序列化。最常见的反序列化情况便是服务器的 SESSION,当有大量用户并发访问,就有可能出现庞大数量的 SESSION 对象,内存显然不够用,于是 Web 容器便会将 SESSION 先序列化到硬盘中,等需要使用时,再将保存在硬盘中的对象还原到内存中,这个存储再拿出来的过程便是序列化和反序列化的过程。

  一般来说,把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化。与 PHP 反序列化漏洞一样,一旦用户输入的不可信数据进行了反序列化操作,那么就有可能触发序列化参数中包含的恶意代码。这个非预期的对象产生过程很有可能会带来任意代码执行,以便攻击者做进一步的攻击。  在 Java 中反序列化漏洞之所以比较严重的原因之一是:Java 存在大量的公用库,例如 Apache Commons Collections。而这其中实现的一些类可以被反序列化用来实现任意代码执行。WebLogic、WebSphere、JBoss、Jenkins、OpenNMS 这些应用的反序列化漏洞能够得以利用,便是依靠了Apache Commons Collections。当然反序列漏洞的根源并不在于公共库,而是在于 Java 程序没有对反序列化生成的对象的类型做限制。  Java 反序列化漏洞一般有以下几种危害:任意代码执行,获取 SHELL,对服务器进行破坏。  Java 反序列化是一个全新的知识点,无论你之前是否了解过 Java 反序列化,接下来都将带领大家一同回顾学习 Java 序列化和反序列化的过程。提到 Java 的序列化与反序列化,我们不得不提及其序列化过程与反序列化过程。ObjectOutputStream 类的 writeObject() 方法可以对参数指定的 obj 对象进行序列化操作,并将得到的字节序列写到目标输出流中。相反的,ReadObject()方法则是从源输入流中读取字节序列,再将其反序列化为对象并返回。这有点类似于 PHP 中的 serialize()与unserialize()。

Part-02

java反序列化代码

一、序列化

    对于序列化的例子,我们可以先写一个 Person 类,内容如下:

从代码看Java反序列化漏洞
  接着,我们编写一个包含序列化和反序列化的类 TestObjSerializeAndDeserialize 分别对其进行操作。
从代码看Java反序列化漏洞

  运行 TestObjSerializeAndDeserialize 得到的结果。

从代码看Java反序列化漏洞

  打开 Person.txt 文件可以发现以下内容。重点是ACED0005,序列化特征,面试重点,可以记下。

从代码看Java反序列化漏洞

二、反序列化

  readObject()在反序列化过程中起到了至关重要的作用,接下来让我们再看一个例子,首先编写一个 Evil 类,内容如下。

从代码看Java反序列化漏洞

  接着,编写我们进行序列化操作的类 SerializeAndDeserialize。

从代码看Java反序列化漏洞
从代码看Java反序列化漏洞

    运行编译出来的类,我们会发现成功地执行了“open -a Calculator”,从这里我们可以发现在序列化与反序列化编写不当的情况下,极有可能引发任意代码执行漏洞,反序列化,如下图。

从代码看Java反序列化漏洞

三、如何发现反序列化漏洞

    反序列化漏洞和其他基础漏洞一样,也需要特定的触发条件。我们在白盒审计时只需要通过搜索源代码中的这些特定函数即可快速地定位到可能存在问题的代码块。主要函数如下。

从代码看Java反序列化漏洞

  当我们通过搜索关键函数或库,找到存在反序列化操作的文件时,便可开始考虑参数是否可控,以及应用的 Class Path 中是否包含 Apache Commons Collections 等危险库(ysoserial 所支持的其他库亦可)。同时满足了这些条件后,我们便可直接通过 ysoserial 生成所需的命令执行的反序列化语句,进一步验证漏洞是否存在。

原文始发于微信公众号(锐鉴安全):从代码看Java反序列化漏洞

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月22日23:50:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   从代码看Java反序列化漏洞http://cn-sec.com/archives/3986686.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息