说到PHP反序列化,首先要了解什么是序列化
PHP里面有关序列化的两个函数:
serialize:序列化 :把一个对象转成字符串形式, 可以用于保存
unserialize: 反序列化:把serialize序列化后的字符串变成一个对象
看如下代码
class User
{
public $age = 0;
public $name = '';
public function PrintData()
{
echo 'User ' . $this->name . ' is ' . $this->age
. ' years old.
';
}
}
$usr = new User();
$usr->age = 20;
$usr->name = 'John';
$usr->PrintData();
echo serialize($usr);
?>
先运行一下代码
输出了User这个类序列化后的字符
下面说下这个序列化的字母的意思
O:类的缩写
4:类名User的长度为4
User:类名
2:两个成员变量
s :成员变量的类型string
3:age的长度为三
age:变量的名字
i:成员变量的类型int
20:为成员变量赋的值
后面的部分以此类推
首先了解一下php中的魔术方法:
php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。
这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。
为了更好的理解magic方法是如何工作的,在2.php中增加了三个magic方法,__construct, __destruct和__toString。
可以看出,__construct在对象创建时调用,__destruct在php脚本结束时调用,__toString在对象被当作一个字符串使用时调用。
__construct 当一个对象创建时被调用,
__destruct 当一个对象销毁时被调用,
__toString 当一个对象被当作一个字符串被调用。
__wakeup() 使用unserialize时触发
__sleep() 使用serialize时触发
__destruct() 对象被销毁时触发
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象调用为函数时触发
PHP反序列化漏洞
PHP反序列化漏洞又称PHP对象注入,是因为程序对输入数据处理不当导致的
一、__wakeup( )绕过
(CVE-2016-7124)
反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。
影响版本:
PHP before 5.6.25
7.x before 7.0.10
二
当目标对象被private、protected修饰时的构造方法。
用%00绕过
未完待续。。。。。。。
标签:__,触发,PHP,对象,调用,序列化
来源: https://blog.csdn.net/Mars748/article/details/102770284