反序列化字符串转换成对象
O:object
反序列化漏洞
以 __ 开头的函数,是PHP 中的魔术方法。
类中的魔术方法,在特定情况下会自动调用。即使魔术方法在类中没有被定义,也是真实存在的。
__construct() 在创建对象时自动调用
__destruct() 在销毁对象时自动调用
__wakeup() unserialize()时会自动调用这个函数
__sleep() serialize()时会自动调用这个函数
代码运行原理
序列化:将类 TestClass 实例化为一个序列化的字符串
反序列化:解析从序列化字符串中恢复对象的函数(通过先将序列化字符串解码成字节流,然后再将其反序列化为对象的方式实现的。)
使用反序列化代码调取计算器
<?php
class TestClass {
public function __wakeup() {
system($_GET["cmd"]);
}
}
//先序列化成字符串
$serializedData = serialize(new TestClass());
//反序列化(解析从序列化字符串中恢复对象的函数)
$object = unserialize($serializedData);
?>
调取计算机
?cmd=calc
当反序列化参数中包含 cmd 参数时,会调用 __wakeup 方法,该方法接收 cmd 参数并执行系统命令。这是因为系统函数 system 接收一个参数,并执行操作系统命令。所以,当序列化参数中包含 cmd 参数时,它会被用于 system 函数,并被执行