Java反序列化和PHP反序列化的区别

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


反序列化存在的意义是为了数据传输,类是无法直接进行传输的。通过序列化后转换为字符串格式或者JSON格式进行传输

序列化与反序列化

  • seriallization 序列化 : 将对象转化为便于传输的格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串。

  • deseriallization 反序列化:将序列化的数据恢复为对象的过程。

PHP反序列化漏洞

PHP反序列化

  • serialize()将对象序列化成字符串。

  • unserialize()将字符串反序列化回对象。

序列化

  • 对象转换成字符串

  • 方便传输

反序列化

  • 字符串转换成对象

  • O:object

<?php
    //创建类
    class Stu{
        public $name;
        public $age;
        public $sex;
    }
	
	//创建对象
    $stu1 = new Stu();
    $stu1->name = "wuhu";
    $stu1->age = 18;
    $stu1->sex = true;
    var_dump($stu1);
    echo "<hr />";
    echo serialize($stu1);

?>

Java反序列化和PHP反序列化的区别,Web漏洞原理,网络安全,系统安全,安全,开发语言,java,php,反序列化

类中的魔术方法,在特定情况下会自动调用。即使魔术方法在类中没有被定义,也是真实存在的。

两个下划线:

  • __construct():在创建对象时自动调用。
  • __destruct()::在销毁对象时自动调用。
  • __wakeup()unserialize()时会自动调用这个函数
  • __sleep()serialize()时会自动调用这个函数

以_开头的函数,是PHP中的魔术方法,是为了更快的响应。__wakeup()和__sleep()方法在互联网上会被频繁调用。

反序列化漏洞不能通过黑盒测试来查找漏洞。只能通过白盒测试,也就是代码审计

反序列化漏洞攻击者是不可控的,因为功能代码全是开发者自己写的。

<?php

    class animal{
        public $name;
        public $age;

        public function __sleep(){
            if(@$_GET['cmd']=="abc"){
                a();
            }
        }

    }

    $an1=new animal;

    $an1->name="dog";
    $an1->age=3;

    //var_dump($an1);

    @serialize($an1);

?>

Java反序列化和PHP反序列化的区别,Web漏洞原理,网络安全,系统安全,安全,开发语言,java,php,反序列化

什么是反序列化漏洞?

序列化和反序列化本身是为了实现数据在网络上完整高效的传输,但是由于反序列化过程中,对象的魔术方法会自动调用,魔术方法本身调用了别的方法,最终呈现一种链式调用,直到执行任意的代码或者命令。并且危险函数的参数可控

修改序列化后的数据,目的是什么?

为了满足一定的条件以后实现链式调用。

Java反序列化漏洞

序列化

ObjectOutputStream --> writeObject()

反序列化:

ObjectInputStream --> readObject() 

实验

Person类

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Person implements Serializable {
    public int age;
    public String name;

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        Runtime.getRuntime().exec("calc");
        // 默认的反序列化操作
        in.defaultReadObject();
    }
}

注意:想让某个类执行序列化或者反序列化必须实现Serializable接口。

Test类

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person p=new Person();
        p.age=18;
        p.name="wuhu";
		
        //将Person这个类的对象序列化后存放到wuhu.bin文件中
        //没有指定路径就表示存放到当前路径中
        serialize(p,"wuhu.bin");


        System.out.println("反序列化结果:" + deserialize("xiu.bin"));
    }
	
    //序列化
    public static void serialize(Object obj, String filePath) throws IOException {
        try (FileOutputStream fileOut = new FileOutputStream(filePath);
             ObjectOutputStream objectOut = new ObjectOutputStream(fileOut)) {
            objectOut.writeObject(obj);
        }
    }
	
    //反序列化
    public static Object deserialize(String filePath) throws IOException, ClassNotFoundException {
        try (FileInputStream fileIn = new FileInputStream(filePath);
             ObjectInputStream objectIn = new ObjectInputStream(fileIn)) {
            return objectIn.readObject();
        }
    }
}

序列化后的字符串

Java反序列化和PHP反序列化的区别,Web漏洞原理,网络安全,系统安全,安全,开发语言,java,php,反序列化

说明:不同的编程语言的序列化和反序列化后的数据格式不一样。

那么漏洞点在哪里?

将Person类中的readObject方法注释了执行的时候,输出结果就是输出了反序列化后的结果。

Java反序列化和PHP反序列化的区别,Web漏洞原理,网络安全,系统安全,安全,开发语言,java,php,反序列化

那么如果重写readObject方法后,在方法中添加一个Runtime.getRuntime().exec("calc"); 这行代码使用 Java 的 Runtime 类执行操作系统命令,即在 Windows 系统上运行计算器应用程序(calc)。执行结果如下:

Java反序列化和PHP反序列化的区别,Web漏洞原理,网络安全,系统安全,安全,开发语言,java,php,反序列化

在实际的开发环境中,需要重写readObject()方法,例如:从前端传递的值是base64编码的,而系统的方法不识别base64,所以需要在重写的readObject()方法中先解码,将解码完的对象再去调用系统的方法。

漏洞成因

Java反序列漏洞的成因是函数的链式调用,满足链式调用的全部条件,并且参数可控制。以及重写了readObject()方法,才能造成Java反序列漏洞。(条件苛刻)。当然如果没有重写readObject()方法,执行的就是系统的反序列化方法,也就没有了反序列化漏洞了。

什么是反序列化漏洞?

PHP的反序列化和java的反序列化是两种不同的类型,序列化和反序列化本身没有漏洞点,只是为了实现数据的完整高效的传输。

PHP反序列漏洞是由于类里面的魔术方法调用了某个函数,该危险函数又调用了别的函数,最终执行到了危险函数的位置。

JAVA反序列化漏洞是由于开发者重写了readObject方法,该readObject方法方法调用了别的方法,最终执行到了例如Transfrom方法的危险方法(链式调用)。

shiro :爆破密钥,找寻CC利用链文章来源地址https://www.toymoban.com/news/detail-732146.html

到了这里,关于Java反序列化和PHP反序列化的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 不安全的反序列化(php&java)及漏洞复现

    不安全的反序列化(php&java)及漏洞复现

    A8:2017-不安全的反序列化 A08:2021-Software and Data Integrity Failures 为什么要序列化? 序列化, 将对象的状态信息转换为可以存储或传输的形式的过程 ,这种形式大多为字节流、字符串、json 串。在序列化期间内,将对象当前状态写入到临时或永久性的存储区。以后,就可以通过从

    2024年02月09日
    浏览(18)
  • Web安全--反序列化漏洞(java篇)

    Web安全--反序列化漏洞(java篇)

    序列化的意义就在于方便存储和传输,永久的保存到硬盘中,通常保存在一个文件中。 序列化:将java对象转换为字节序列的过程 反序列化:序列化的逆过程,从储存区读出字节序列还原成对象的过程 java应用在对用户的输入没有进行严格的检查时,即传入了不可信的数据做

    2024年02月09日
    浏览(16)
  • Day60:WEB攻防-PHP反序列化&POP链构造&魔术方法流程&漏洞触发条件&属性修改

    Day60:WEB攻防-PHP反序列化&POP链构造&魔术方法流程&漏洞触发条件&属性修改

    目录 PHP-DEMO1-序列化和反序列化 序列化操作 - 即类型转换 序列化案例 PHP-DEMO2-魔术方法触发规则 __construct(): //当对象new的时候会自动调用 __destruct()://当对象被销毁时会被自动调用 __sleep(): //serialize()执行时被自动调用 __wakeup(): //unserialize()时会被自动调用 __invoke(): //把对象当

    2024年04月27日
    浏览(22)
  • 反序列化漏洞(PHP)

    反序列化漏洞(PHP)

    0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更具维护性 0x02. 为什么会有序列化 序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型

    2024年02月06日
    浏览(12)
  • php反序列化漏洞基础

    php反序列化漏洞基础

            序列化是将对象或类转换为字符串的过程 ,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。         通过 序列化,可以将对象或类转换成一串字

    2024年01月20日
    浏览(24)
  • 小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&数据提取&组件安全

    小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&数据提取&组件安全

    # 知识点: 1 、 Java 反序列化演示 - 原生 API 接口 2 、 Java 反序列化漏洞利用 -Ysoserial 使用 3 、 Java 反序列化漏洞发现利用点 - 函数 数据 4 、 Java 反序列化考点 - 真实 CTF 赛题 - 审计分析 # 内容点: 1 、明白 -Java 反序列化原理 2 、判断 -Java 反序列化漏洞 3 、学会 -Ysoserial 工具

    2024年04月10日
    浏览(38)
  • 反序列化漏洞及PHP魔法函数

    反序列化漏洞及PHP魔法函数

    目录 1、漏洞原理 2、序列化(以PHP语言为例) 3、反序列化 4、PHP魔法函数 (1)__wakeup() (2)__destruct() (3)__construct() (4)__toString() (5)__get() (6)__call() PHP反序列化漏洞也叫PHP对象注入,形成的原因是程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反

    2024年02月04日
    浏览(19)
  • PHP反序列化漏洞-魔术方法绕过

    一、__wakeup()魔法函数绕过: 在PHP中,__wakeup()是一个魔术方法,用于在反序列化对象时自动调用。 当反序列化字符串中的对象属性个数大于实际属性个数时 ,可以利用这个漏洞进行绕过。 触发条件: PHP版本为5.6.25或早期版本,或者PHP7版本小于7.0.10。 反序列化字符串中的对

    2024年01月18日
    浏览(31)
  • PHP反序列化漏洞之魔术方法

    PHP反序列化漏洞之魔术方法

    PHP魔术方法 (Magic Methods) 是一组特殊的方法,它们在特定的情况下会被自动调用,用于实现对象的特殊行为或提供额外功能。这些方法的名称都以双下划线开头和结尾,例如: __construct() 、 __toString() 等。 魔术方法可以帮助我们实现一些特殊的行为,例如对象的初始化、属性

    2024年02月16日
    浏览(13)
  • PHP反序列化漏洞-字符串逃逸

    字符串逃逸(闭合) 字符串逃逸(闭合)是一种在反序列化函数可控的情况下,通过修改序列化字符串中的敏感字符来达到字符串逃逸的方法。 具体而言,可以通过修改变量名等个数,使得序列化字符串中的字符个数与实际变量值个数不一致 。由于反序列化机制要求字符串

    2024年01月20日
    浏览(13)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包