先来看一段后端php代码:
<?php
class user {
public $name;
public $age;
public $password;
public function __wakeup(){
system($this->name);
}
}
$obj = new user();
$obj->name = "calc";
$obj->age = 25;
$obj->password = "123456";
$ser = serialize($obj);
echo "序列化结果:";
var_dump($ser);
echo "<br>";
echo "反序列化结果:";
$unser = unserialize($ser);
var_dump($unser);
?>
代码解析
该代码演示了PHP中类的定义、对象序列化与反序列化过程,以及魔术方法__wakeup()的触发机制。
类定义与成员变量
定义了一个名为user的类,包含三个公共成员变量:
$name:存储用户名$age:存储年龄$password:存储密码
魔术方法 __wakeup()
public function __wakeup(){
system($this->name);
}
当对象被反序列化时自动调用该方法,其中system()函数会执行$this->name指定的系统命令(示例中为calc,将打开Windows计算器)。
对象创建与赋值
$obj = new user();
$obj->name = "calc";
$obj->age = 25;
$obj->password = "123456";
创建user类实例并设置属性值。
序列化过程
$ser = serialize($obj);
var_dump($ser);
输出类似:
string(84) "O:4:"user":3:{s:4:"name";s:4:"calc";s:3:"age";i:25;s:8:"password";s:6:"123456";}"
反序列化与漏洞
$unser = unserialize($ser);
反序列化时会自动触发__wakeup(),导致system("calc")被执行。这种机制可能被恶意利用执行任意系统命令(如替换calc为rm -rf /等危险命令)。
安全建议
- 避免在
__wakeup()中执行敏感操作 - 对反序列化数据来源进行严格校验
- 使用
__wakeup()时避免直接调用系统函数 - 考虑使用
json_encode()/json_decode()替代序列化
该示例展示了反序列化漏洞的典型场景,实际开发中需特别注意此类安全隐患。

1184

被折叠的 条评论
为什么被折叠?



