首页 > 其他分享 >反序列化魔术方法

反序列化魔术方法

时间:2024-06-02 16:54:21浏览次数:28  
标签:__ 触发 调用 对象 unserialize 魔术 序列化 方法

魔术方法

成员属性

image-20240602104647717

变量和成员属性是一个东西

__consrtuct构造方法

在对象实例化时执行的方法

__construct()只会在new一个对象时触发,serialiaze和unserialize都不会触发

image-20240602093459339

__destruct()析构函数

__destruct()函数只会在序列化serialize()反序列化unserialize()和销毁一个对象时触发

image-20240602094520984

__call

当前对象体调用一个不存在的方法时被触发

当前对象->不存在的方法

image-20240602095219566

__get

访问一个对象 不存在的 变量时触发

当前对象->不存在的变量

image-20240602100207521

__set

给对象的不存在的变量赋值时触发

当前对象->不存在的变量=参数值

image-20240602101804729

__isset

用isset()和empty()访问不可访问的属性时触发

image-20240602102825879

__unset销毁函数

销毁一个不可访问的成员属性时被触发

image-20240602104616787

__sleep

序列化serialize()时触发

image-20240602105024474

__wakeup

反序列化unserialize()时被触发

image-20240602105253834

__toString

当前对象被当作字符串处理时 被触发也就是把对象转换成字符串

image-20240602110033534

image-20240602144734670

当作字符串处理:

在实例化对象之后,使用echo将其输出

__invoke

当前对象被当作函数调用时触发

image-20240602150120044

总结

  1. __construct(),类的构造函数
  2. __destruct(),类的析构函数
  3. __call(),在对象中调用一个不可访问方法时调用
  4. __callStatic(),用静态方式中调用一个不可访问方法时调用
  5. __get(),获得一个类的成员变量时调用
  6. __set(),设置一个类的成员变量时调用
  7. __isset(),当对不可访问属性调用isset()或empty()时调用
  8. __unset(),当对不可访问属性调用unset()时被调用。
  9. __sleep(),执行serialize()时,先会调用这个函数
  10. __wakeup(),执行unserialize()时,先会调用这个函数
  11. __toString(),类被当成字符串时的回应方法
  12. __invoke(),用调用函数的方式去调用一个对象时的回应方法
  13. __set_state(),调用var_export()导出类时,此静态方法会被调用。
  14. __clone(),当对象复制完成时调用
  15. __autoload(),尝试加载未定义的类
  16. __debugInfo(),打印所需调试信息

反序列化

序列化serialize():将对象转换成字符串,

反序列化unserialize():将转化为字符串的对象转化回来

反序列化时 使用unserialize()函数会触发魔术方法,只要能控制unserialize()入口,就能实现注入

先找能触发serialize或者unserialize的魔术方法

去实例化对象 然后去触发这个方法
比如先找`__wakeup,__sleep`方法或者`__destruct`方法用unserialize(或serialize)触发

image-20240602161902930

序列化

O:对象名的长度:"对象名":对象属性个数:{s:属性名的长度:"属性名";s:属性值的长度:"属性值";}

image-20240602163953081

反序列化

image-20240602164043155

标签:__,触发,调用,对象,unserialize,魔术,序列化,方法
From: https://www.cnblogs.com/Yolololo/p/18227302

相关文章

  • 苹果手机怎么恢复微信聊天记录?2024不要错过的4个方法!
    作为一款广受欢迎聊天APP,微信会保存我们的聊天记录,包括图片、视频和信息。然而,很多人都想知道,如果我们意外丢失或删除了苹果手机微信上的数据,是否还能恢复它们?答案是100%肯定的。接下来,本文将为你介绍苹果手机怎么恢复微信聊天记录,其中包括在有备份或无备份的情况下找回删除的......
  • rt-thread 系统pm组件在4.1.1版本的无法正常唤醒的问题解决方法
    在老的rt-thread版本系统pm组件调试ok,后来使用4.1.1版本时发现进入低功耗后无法正常唤醒,问题解决路径如下硬件信息:cpu STM32L431CCT6新建系统打开pm组件后也没有drv_pm.c和drv_lptim.c自动添加,需要到系统目下找到并复制到driver目录下C:\RT-ThreadStudio\repo\Extract\R......
  • phar反序列化例题
    [CISCN2019华北赛区Day1Web1]Dropbox目录穿越下载注册、登录,发现可文件上传。上传文件后发现可以下载或者删除,尝试上传php马但是发现都被过滤,抓包下载的选项。发现下载可能存在目录穿越。于是尝试../../index.php,发现可成功下载。于是将download.phpdelete.php下载,审源码......
  • java中判断String类型为空和null的方法
    1.判断一个String类型的变量是否为空(即长度为0)或者为null在Java中,判断一个String类型的变量是否为空(即长度为0)或者为null,通常需要使用两个条件语句来进行检查。这是因为null表示变量没有引用任何对象,而空字符串("")表示变量引用了一个没有内容的字符串对象。下面是一个具体的代码......
  • [干货]在纯血鸿蒙星河版next中组件封装方法--看我就够了
    首先组件封装一般是为了解决两个问题,复用和一定程度上提高维护性,组件的本质就是一个接受参数返回UI的函数容器,所以封装的重点和难点就是抽象合适的参数类型返回合适的UI,接下来我来给家人们说说封装组件的一般方法封装组件的一般方法呢有两种,思想家人们掌握之后往上套就行了,我......
  • 掌握这些方法,无人直播不再怕封号
    在无人直播领域,封号是一个让人头疼的问题。然而,并非所有人都会遭遇封号,这其中究竟有何秘诀呢?本文将为你揭开谜底,告诉你如何利用技术手段实现安全防封。首先,要了解平台的规则和政策。不同的平台对于无人直播的规定可能不同,因此在开始之前,务必仔细阅读并遵守相关规定。这样......
  • 5.17反序列化
    1、原理序列化:对象状态-可存储或传输形式的过程,将状态信息保存为字符串;反序列化:序列化的字符串-对象;恶意代码注入到应用程序中,程序从不安全来源反序列化数据时,数据从一种格式(json、xml)转化为(对象或列表),如果不检查安全性,则攻击者构造恶意代码在数据,程序反序列化时,恶意代码执行......
  • 方法递归(黑马)
    publicstaticvoidmain(String[]args){test1();}publicstaticvoidtest1(){System.out.println("----test1----");test1();}publicstaticvoidtest2(){System.out.println("----test2----&......
  • 高度向稀疏的毫米波成像方法
    分析:高度向稀疏的采样数据是整行缺失的,每一列上都缺失了大量数据,这可能造成高度向的混叠现象,但是每一行上是没有缺失数据的,这说明方位向应该是不会出现混叠现象。考虑到上述现象,对于三维成像,可不可以先实现距离-方位向的二维成像,而后再实现高度向的聚焦,进而实现三维成像。想......
  • 改进rust代码的35种具体方法-类型(二十)-避免过度优化的诱惑
    上一篇文章-改进rust代码的35种具体方法-类型(十九)-避免使用反射“仅仅因为Rust允许您安全地编写超酷的非分配零复制算法,并不意味着您编写的每个算法都应该是超级酷的、零复制和非分配的。”-trentj   这本书中的大多数项目都旨在帮助现有程序员熟悉Rust及其成语。......