终身高级VIP会员 
    
- 资源币
 - 11472 
 
	- 积分
 - 4971
 
- 贡献
 - 0 
 
- 在线时间
 - 2065 小时
 
- 注册时间
 - 2015-4-20
 
- 最后登录
 - 2025-10-9
 
 
  
 
 
 | 
 
PHP反序列化漏洞代码审计1、什么是序列化  
 
 
 
A、PHP网站的定义:  
 
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。  
 
 
按个人理解就是:  
 
serialize()将一个对象转换成一个字符串,unserialize()将字符串还原为一个对象。  
当然从本质上来说,反序列化的数据本身是没有危害的,用户可控数据进行反序列化是存在危害的。  
 
 
B、PHP反序列化  
 
php允许保存一个对象方便以后重用,这个过程被称为序列化。为什么要有序列化这种机制呢?在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。试想,如果为一个脚本中想要调用之前一个脚本的变量,但是前一个脚本已经执行完毕,所有的变量和内容释放掉了,我们要如何操作呢?难道要前一个脚本不断的循环,等待后面脚本调用?这肯定是不现实的。因为这样的操作,在小项目还好,在大项目里是极其浪费资源的。但是如果你将一个对象序列化,那么它就会变成一个字符串,等你需要的时候再通过反序列化转换回变了变量,在进行调用就好了,在这样就剩了资源的使用。  
 
 
2、理解PHP反序列化漏洞  
PHP类中有一种特殊函数体的存在叫魔法函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。  
而在反序列化时,如果反序列化对象中存在魔法函数,使用unserialize()函数同时也会触发。这样,一旦我们能够控制unserialize()入口,那么就可能引发对象注入漏洞。  
 
 
3、PHP反序列化漏洞利用的前提  
a.unserialize()函数的参数可控;  
b.php文件中存在可利用的类,类中有魔术方法  
 
 
 
 
 |   
 
 
 
 |