PHP反序列化漏洞学习
对反序列化漏洞的个人理解
反序列化后会倒着方向的去执类里的东西,倘若类里有一些可以命令执行的那么就会导致命令注入。
反序列化的基础知识
序列化:serialize
反序列化:unrealize
问:为什么要序列化?答:很简单,序列化可以把一个数组或对象转化成一个字符串,方便传输和存储。(数组或者对象[类实例化后称之为对象]不好保存到一个文件当中,转换为字符串了就好存储了)
反序列化的实例:
<?php class Perman { public $name = "19"; public $age = "20"; public $sex = "girl"; function __construct() { echo "hello world.<br/>"; } function action() { echo "This is action<br/>"; } function __destruct() { echo "The End<br/>"; } } $ok = new Perman(); $ok -> action(); echo serialize($ok)."<br/>";//序列化$ok ?>输出效果:
简单分析一下序列化:realize出来的内容:
O:代表对象、6:代表对象的长度、s:字符串(this is action<br/>)的长度、19:代表字符串的长度(有一个换行的html代码占据了五个字节)
可以看到序列化后的代码在构析函数之后执行了。
再来就是:反序列化:unrealize
<?php class F{ public $filename='a.txt'; function __destruct(){ echo '--------------><br />'; } } $a = new F(); echo $a->filename.'<br />'; echo serialize($a); $b = unserializeecho '<br />'.$b->filename; echo '<br />'.$b->filenameF;输出效果:
可以看到析构函数输出了两次, 说明这两个应是同一个类, 只是 $b 多出了一个属性 filenameF, filename可直常输出, filenameF也可正常输出。
对于filenameF就 相当于又返回去执行了F这个对象。倘若在反序列化过程当中:('O:1:"F":1:{s:9:"filenameF";s:8:"bcda.txt";}');可控那么就会导致命令注入,进而产生命令执行。
反序列漏洞的产生
在反序列化的时候没有过滤导致反序列化反向执行的时候产生命令注入。
By:珍惜少年时博客:http://www.cnblogs.com/xishaonian/
*-------------------------------------------*