本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。
本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。
本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。
PHP反序列化
如题
第二个类没用到,只是用来示例。
第一个类在反序列化的时候调用__construct,通过绕过__wakeup(),直接执行__destruct()
payload:
php
输出payload后,修改参数数量,绕过__wakeup()
- 什么是序列化、反序列化?
在开发的过程中常常遇到需要把对象或者数组进行序列号存储,反序列化输出的情况。特别是当需要把数组存储到mysql数据库中时,我们时常需要将数组进行序列化操作。
-
php序列化(serialize):是将变量转换为可保存或传输的字符串的过程
-
php反序列化(unserialize):就是在适当的时候把这个字符串再转化成原来的变量使用
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
常见的php序列化和反序列化方式主要有:serialize,unserialize;json_encode,json_decode。
- 魔术方法 php中有着魔术方法,以两个__下划线开头的方法称为魔术方法。在触发某个事件后,魔术方法会自动调用。
| 方法名 | 作用 |
|---|---|
| __construct | 构造函数,在创建对象时候初始化对象,一般用于对变量赋初值 |
| __destruct | 析构函数,和构造函数相反,在对象不再被使用时(将所有该对象的引用设为null)或者程序退出时自动调用 |
| __toString | 当一个对象被当作一个字符串被调用,把类当作字符串使用时触发,返回值需要为字符串,例如echo打印出对象就会调用此方法 |
| __wakeup() | 使用unserialize时触发,反序列化恢复对象之前调用该方法 |
| __sleep() | 使用serialize时触发 ,在对象被序列化前自动调用,该函数需要返回以类成员变量名作为元素的数组(该数组里的元素会影响类成员变量是否被序列化。只有出现在该数组元素里的类成员变量才会被序列化) |
| __destruct() | 对象被销毁时触发 |
| __call() | 在对象中调用不可访问的方法时触发,即当调用对象中不存在的方法会自动调用该方法 |
| __callStatic() | 在静态上下文中调用不可访问的方法时触发 |
| __get() | 读取不可访问的属性的值时会被调用(不可访问包括私有属性,或者没有初始化的属性) |
| __set() | 在给不可访问属性赋值时,即在调用私有属性的时候会自动执行 |
| __isset() | 当对不可访问属性调用isset()或empty()时触发 |
| __unset() | 当对不可访问属性调用unset()时触发 |
| __invoke() | 当脚本尝试将对象调用为函数时触发 |
ref: https://www.cnblogs.com/byErichas/p/14989539.html