发布时间:2023-06-01 14:30
php序列化的函数为serialize(),可以将对象中的成员变量转换成字符串。
反序列化的函数为unserilize(),可以将serialize生成的字符串重新还原为对象中的成员变量。
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
简介:php类可能会包含魔术方法,魔术方法命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。这些函数在某些情况下会自动调用。
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发,返回值需要为字符串
__invoke() //当脚本尝试将对象调用为函数时触发
构造函数__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。
析构函数__destruct():当对象被销毁时会自动调用。
唤醒函数__wakeup() :如前所提,unserialize()时会自动调用。
大家可以去这个php在线代码测试测试练习,加深理解
链接: php在线代码测试.
class ABC{
public $test;
function __construct(){
$test =1;
echo \'调用了构造函数
\';
}
function __sleep(){
echo \'调用了sleep函数\';
}
function __destruct(){
echo \'调用了析构函数
\';
}
function __wakeup(){
echo \'调用了苏醒函数
\';
}}
echo \'创建对象
\';
$a = new ABC;
echo \'
\';
echo \'序列化
\';
$a_ser=serialize($a);
echo \'
\';
echo \'反序列化
\';
$a_unser = unserialize($a_ser);
?>
普通成员方法利用(变量属性为public)
普通成员方法利用(变量属性为private)
重名方法利用
sql注入、代码执行、目录编列…