代码编织梦想

一·PHP类与对象

类Class

一个共享相同结构和行为的对象的集合

<?php
 class MyClass{
    var $var1;
    var $var2 ="constant string";

    function myfunc ($arg1,$arg2){
        [......]
    }
    [....]
}

?>

类的实例

$baidu = new Site;
$kitty = new Cat;
$benz = new Car;

二.Magic函数

函数作用

函数作用
__construct当一个对象创建时被调用
__destruct当一个对象销毁时被调用
__toString当一个对象被当做一个字符串使用
__sleep在对象被反序列化之前运行
__wakeup在对象被反序列化之后被调用
__serialize对对象调用serialize()方法,PHP 7.4.0起
__unserialize对对象调用unserialize()方法,PHP 7.4.0起

函数作用
__call()在对象上下文调用不可访问的方法时触发
__callStatic在静态上下文中调用不可访问的方法时触发
__get()用于从不可访问的属性读取数据
__set()用于将数据写入不可访问的属性
__isset()在不可访问的属性上调用isset()或者empty()触发
__unset()在不可访问的属性上使用unset()时触发
__invoke()当脚步尝试将对象调为函数时触发

案例

<?php
/**
*Class MyClss
*Magic函数演示
*/
calss Myclass{
    public $var = "hello word\n";

    public function echoString(){
        echo $this->var;
    } 
    //对象创建的时候调用
    public function __construct(){
        echo "__construct\n";
    }
    //对象销毁的时候调用
    public function __destruct(){
        echo "__destruct\n";
    }
    //对象被当成字符串的时候调用
    public function __toString(){
       return "__toString\n";
    }
}

//创建一个新的对象,__construct被调用
$obj = new MyClass();
//调用该类的方法
$obj->echoString();
//以字符形式输出,__toString方法被调用
echo $obj;
//php脚本要结束时,__destruct会被调用
    
?>

三.PHP序列化与反序列化

序列化与反序列化

 

<?php
/**
*Class SerialType
*不同类型的序列化演示
*/
class SerialType{
    
    public $data;
    private $pass;
    const CONTRY = 'CHINA';
    
    public function __construct($data,$pass)
    {
        $this->data = $data;
        $this->pass = $pass;
    }
}

$number = 32;
$str = 'hello';
$bool = true;
$NULL = NULL;
$arr = array('a' => 1,'bbbb' => 9);
$obj = new SerialType(data: 'somestr',pass: 'true');

var_dump(serialize($number));
var_dump(serialize($str));
var_dump(serialize($bool));
var_dump(serialize($arr));
var_dump(serialize($obj));
var_dump(value:CONTRY);

?>

其他序列化的格式

json字符串 json_encode

<?php
/**
*Class Jsonclass 
*JSON和XML的序列化演示
*/
class JsonClass{
    public $word = "hello word";
    public $prop = array('name' => 'darkroom', 'age' => 31, 'motto' => 'Apple keep doctor');

}
$obj = new JsonClass();
//转化对象为JSON字符串
$s = json_encode($obj);
//转换对象为XML
$x = wddx_serialize_value($obj );
echo $s;
echo "\n";
echo $x;
?>

xml字符串 wddx_serialize_value

二进制格式

字节数组

序列化中不需要序列化的字段

<?php

class User{
    const SITE = 'darkroom';

    public $username;
    public $nickname;
    private $password;

    public function __construct($username, $nickname, $password){
        $this->username = $username;
        $this->nickname = $nickname;
        $this->password = $password;
    }
    //重载序列化调用非法
    public function __sleep(){
        //返回需要序列化的变量名,过滤掉password变量
    return array('username', 'nickname'); 
    }
}
$user = new User(username:'hackerdarkroom', nickname:'darkroom', password:'123456');
var_dump(serialize($user));
?>

反序列化演示

<?php
/**
*Class UnSerializeTest
*反序列化的演示
*/
class UnSerializeTest{
    public $var = "hello darkroom\n";
    public function echoString(){
        echo $this->var;
    }

     public function __consturct(){
        echo "__consturct\n";
    }
    
    public function __destruct(){
        echo "__destruct\n";
    }

    public function __serialize(){
        echo "__serialize\n";
    }

    public function __wakup(){
        echo "__wakup\n";
    }
}

//创建一个新的类
//$obj1 = new UnSerializeTest();
//调用该类的
//$obj1->echoString();
//输出序列化以后的字符
//echo "序列化以后的结果:\n";
//echo serialize($obj1);

//反序列化
//"0"表示对象,“15”表示对象长度为15,"UnSerializeTest"为对象名,“1”表示有一个参数
//“{}”里面是参数的key和value,"s"表示string对象,“11”表示长度,“var”则为key
//!注意,var内容和长度可以修改
//$obj2 = unserialize('0:15"UnSerializeTest":1:{s:3:"var";s:12:"hello darkroom";}');

//调用对象的方法
echo "反序列化以后执行的结果: \n";
var_dump($obj2);
$obj2->echoString();
?>

注意:

1.如果传递的字符串不可以序列化,则返回FALSE

2。如果对象没有预定义,反序列化得到的对象是_PHP_Incomplete_Class

作用

1.传输对象

2.用作缓存(Cookie,Session)

反序列化与Magic函数

__wakup

__unserialize

如果类中同时定义了__unserialize()和__wakup()两个魔法函数,则只有__unserialize()方法会生效,__wakup()方法会被忽略

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52074678/article/details/124705081

反序列化漏洞原理从零学起-小白都能懂反序列化漏洞-爱代码爱编程

前言 是不是语言基础不够好?是不是很想了解安全圈子里一天说到晚的java各类中间件反序列化漏洞的底层原理,但是看网上的文章又各种看不懂?首先,心态要摆正,java反序列化漏洞对于安全人员或者开发人员而言,都不是简单的东西,

【序列化】UNSAFE_DESERIALIZATION 不安全的反序列化和反序列化漏洞-爱代码爱编程

文章目录 Unsafe Deserialization反序列化漏洞背景认识Java序列化与反序列化用途应用场景Java中的API实现:序列化基础类型参数序列化对象漏洞是怎么来的呢?解决方案 注意:本文例子都是在JDK1.8下跑的 Unsafe Deserialization 进行代码检查时,Coverity工具在进行json转换时

rmi 反序列化漏洞_Java安全之RMI反序列化-爱代码爱编程

Java安全之RMI反序列化 0x00 前言 在分析Fastjson漏洞前,需要了解RMI机制和JNDI注入等知识点,所以本篇文来分析一下RMI机制。 在Java里面简单来说使用Java调用远程Java程序使用的就是RMI,调用C的程序调用的是JNI,调用python程序使用到的是Jython。RMI、JNI、Jython,其实在安全中都能发挥比

pikachu PHP反序列化(皮卡丘漏洞平台通关系列)-爱代码爱编程

目录 1、学习,学习一下 2、尝试,尝试一下 3、在哪里?漏洞代码在哪里? 4、尾声 1、学习,学习一下 先跟着pikachu简单学习一下什么叫序列化和反序列化: 但其实我已知这里有3个地方写的不对,需要更正一下: (1)序列化结果中的S不是对象名称,而是类名称;同样的,O和S中间的1应该是类名字长度。 (2)几个魔法函数的举例有点让人误

Apereo CAS 4.1/4.x 反序列化RCE漏洞 漏洞复现-爱代码爱编程

Apereo CAS 4.1反序列化RCE漏洞 by ADummy 0x00利用路线 ​ 构造(可以使用ysoserial)可执行命令的序列化对象—>发送给目标61616端口—>访问web管理页面,读取消息,触发漏洞—>代码执行 0x01漏洞介绍 ​ Apereo CAS是企业级单点登录系统。CAS试图通过Apache Comm

反序列化漏洞-爱代码爱编程

文章目录 一、序列化和反序列化1、序列化2、反序列化二、PHP序列化三、Java序列化格式1、JDK类库中序列化和反序列化API2、实现序列化的要求3、实现Java对象序列化与反序列化的方法4、JDK类库中序列化的步骤5、JDK类库中反序列化的步骤6、序列化和反序列化的示例四、什么是反序列化漏洞?五、挖掘反序列化漏洞六、反序列化漏洞的利用1、修改对

网络安全-反序列化漏洞简介、攻击与防御-爱代码爱编程

目录 简介 PHP序列化 Python序列化 攻击 PHP举例 Python举例 防御 参考 简介 各种语言都有反序列化漏洞,Java、PHP、Python等。序列化即将对象转化为字节流,便于保存在文件,内存,数据库中;反序列化即将字节流转化为对象,也就是序列化的逆过程。 PHP序列化 php中序列化和反序列化函数为serializ

Shiro反序列化命令执行漏洞分析-爱代码爱编程

Shiro反序列化命令执行漏洞分析 一、shiro组件介绍 Apache Shiro是一个强大且易用的Java安全框架,执行身份认证、授权、加密和会话管理。使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 二、漏洞分析 shiro版本:<=1.2.24 漏洞触发点 org.a

CVE-2021-21351 XStream反序列化远程代码执行漏洞-爱代码爱编程

0x00 简介 XStream是Java类库,用来将对象序列化成XML (JSON)或反序列化为对象。XStream是自由软件,可以在BSD许可证的许可下分发。它是一种OXMapping 技术,是用来处理XML文件序列化的框架在将javaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁琐。 0x01 漏洞

漏洞挖掘:一次反序列化漏洞学习-爱代码爱编程

0x01 漏洞背景 该漏洞使用了在当时为新型技术的rmi反序列化漏洞绕过了之前的修补补丁 。适用版本包括了10.3.6.0、12.1.3.0、12.2.1.0以及12.2.1.1等多个版本。将从环境搭建、漏洞补丁分析、绕过方法思考、payload构建等多个方面进行研究,尽可能的将一些坑点和知识点摸排清楚,从0到1学习weblogic反序列化。 0x02

命令执行和反序列化漏洞-爱代码爱编程

命令与代码执行漏洞 1、远程系统命令执行:一般出现这种漏洞,是因为应用系统在设计上需要给用户提供指定的远程命令接口,比如我们常用的防火墙、路由器、入侵检测等设备的web管理页面上一般给用户提供一个ping操作的web界面;用户从web界面输入目标ip,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。而设计者在完成该功能时,没有做严格的安全

什么是反序列化?反序列化的过程,原理-爱代码爱编程

介绍 本篇主要分析java序列化、反序列化的过程,原理, 并且通过简化版URLDNS做案例分析利用链原理。 本篇很重要,打好基础是关键。 什么是序列化 我的理解很简单,就是将对象转化为可以传输、储存的数据。 什么意思? 正常一个对象,只能存在于程序运行时,当程序运行结束了,对象就消失了,对象只在程序运行时存在 如有这样一个需求,我想把user对象

【WEB安全】Fastjson反序列化-爱代码爱编程

Fastjson反序列化 一、简介二、序列化与反序列化三、Fastjson漏洞介绍1、漏洞原理2、RMI3、JNDI4、JEP290四、编写的简单测试的环境五、漏洞版本1、fastjson<=1.2.241.1、TemplatesImpl 利用链分析1.2、JNDI利用链分析1.3、JNDI利用1.4、官方进行的修复2、fastjson<

【反序列化漏洞01】序列化与反序列化简介-爱代码爱编程

目录 1 背景2 定义3 作用及优点4 例子:测试php代码中序列化与反序列化执行过程4.1 测试环境4.2 测试序列化过程4.3 测试反序列化过程5 例子:SessionID在php中的序列化与反序列化5.1 SessionID序列化5.2 SessionID反序列化6 总结参考文献 1 背景 在PHP中,每个类的定义都以关键字 class

java安全(五)java反序列化-爱代码爱编程

给个关注?宝儿!给个关注?宝儿!给个关注?宝儿! 1. 序列化 在调用RMI时,发现接收发送数据都是反序列化数据. 例如JSON和XML等语言,在网络上传递信息,都会用到一些格式化数据,大多数处理方法中,JSON和XML支持的数据类型就是基本数据类型,整型、浮点型、字符串、布尔等,如果开发者希望在传输数据的时候直接传输一个对象,那么就不得不想办法扩展

Java 中的序列化安全漏洞梳理-爱代码爱编程

背景 现阶段公司会进行季度的安全巡检,扫描出来的 Java 相关漏洞,无论是远程代码执行、还是 JNDI 注入,基本都和 Java 的序列化机制有关。本文简单梳理了一下序列化机制相关知识,解释为什么这么多漏洞都和 Java 的序列化有关,以及后续怎么避免这些安全漏洞,减少版本升级工作量。同时能基于本文的知识,在看到序列化漏洞后,简单评估该漏洞对自身应用

【web安全】Spring Boot eureka xstream 反序列化-爱代码爱编程

一、漏洞概述 Eureka 是 Spring Cloud Netflix 模块的子模块,它是 Spring Cloud 对 Netflix Eureka 的二次封装,主要负责 Spring Cloud 的服务注册与发现功能,开发人员只需引入相关依赖和注解轻松将 Spring Boot 与 Eureka 进行整合。 安全人员(Michael Stepan