原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。
在反序列化的过程中自动触发了某些魔术方法。
漏洞触发条件:unserialize函数的变量可控,php文件中存在可利用的类,类中有魔术方法
魔术方法:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
序列化数据格式:
示例:
<?php class Example { var $var = ''; function __destruct() { eval($this->var); } } unserialize($_GET['a']); ?>
接下来构造序列化数据:a=O:4:"test":1:{s:1:"b";s:10:"phpinfo();";}
成功显示了phpinfo页面:在反序列化该数据时,自动触发了_destruct()函数,执行 eval(phpinfo()):