原理:未对用户输入的序列化字符串进行检测,致使攻击者能够控制反序列化过程,从而致使代码执行,SQL注入,目录遍历等不可控后果。php
在反序列化的过程当中自动触发了某些魔术方法。函数
漏洞触发条件:unserialize函数的变量可控,php文件中存在可利用的类,类中有魔术方法this
魔术方法:spa
__construct()当一个对象建立时被调用对象
__destruct()当一个对象销毁时被调用blog
__toString()当一个对象被看成一个字符串使用字符串
__sleep() 在对象在被序列化以前运行io
__wakeup将在序列化以后当即被调用function
序列化数据格式:class
示例:
<?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()):