反序列化

1. 定义

  • 序列化就是把****一个对象变成字符串的操作,方便以特定的格式在进程之间跨平台、安全的进行通信;反序列化就是把字符串转化为对象的操作。PHP反序列化漏洞也叫PHP对象注入

2. 形成原因

  • 程序****没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制

3. 危害

  1. 代码、系统命令执行
  2. getshell

4. 防御

  1. 严格过滤用户输入的unserialize函数的参数
  2. 对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";}