本文内容:
- 什么是发序列化
- 小技巧函数
- 魔术方法和反序列化利用
1,什么是反序列化:
1.什么是序列化:
是将对象的转台信息转换为可以存储或传输的形式的过程[将状态信息转换为字符串]。
2.什么是反序列化:
反序列化就是再将这个状态信息拿出来使用[将字符串转换为状态信息]。
3.状态信息:
对象、类、数组、变量、自定函数等。
4.反序列化漏洞:
可以任意控制反序列化处理的字符串,就是反序列化漏洞。
2,小技巧函数:
1.__FILE__:获取当前文件路径。
2.show_source():显示文件源码。
3.print_r():可以输出非字符串,如对象,数组等。
4.serialize:序列化,将对象状态信息转化为字符串。
5.unserialize:反序列化,将字符串转化为对象的状态信息。
举例:
show_source(__FILE__) :查看当前文件的内容[源码]
show_source("x.php") :查看x.php文件的内容[源码]
serialize():将对象转变成字符串:
<?php
show_source(__FILE__);
class aa {
var $b = '123';
}
$class1 = new aa; 新建对象
$class1_ser=serialize($class1); 序列化
var_dump($class1_ser);
?>
运行结果:O:2:"aa":1:{s:1:"b";s:3:"123":}
解释:
O表示object对象。
2表示对象的名称有2个字符。
aa对象名称,1表示只有一个值
s表示字符串1表示变量名字长度
s表示字符串3表示变量值的长度
unserialize():可以从序列化后的结果中恢复对象[object]。
<?php
show_source(__FILE__);
class aa {
var $b = '123';
}
$class2 = 'O:2:"aa":1:{s:1:"b";s:3:"124";}' ;
$class2_ser=unserialize($class2); 反序列化
var_dump($class2_ser);
?>
运行结果:aa Object([b] => 124)
3,魔术方法和反序列化利用:
1.__construct():当对床创建[new]时会自动调用,但是在unserialize()时是不会调用的。
2.__destruct():当对象被销毁时会自动调用。
3.__wankeup():如前所提:unserialize()时自动调用。
注意:
本质上serialize()和unserialize()在php内部实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。
当unserialize()的参数可控时,那么用户就可以注入精心构造的payload,当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。