15 常见漏洞 反序列化漏洞
序列化 serialize
对象的状态信息转换为可以存储或传输的形式的过程 在序列化期间,对象将当前的状态写入到临时
或持久性的存储区,将状态信息保存为字符串。
反序列化 unserialize
将序列化后的字符串还原成对象
这里有一点序列化需要注意的东西
php魔法函数
__construct() 当一个对象创建时被调用
__destruct() 当一个对象销毁前被调用
__sleep() 在对象被序列化前被调用
__wakeup 将在反序列化之后立即被调用
__toString 当一个对象被当做字符串使用时被调用
__get(),__set() 当调用或设置一个类及其父类方法中未定义的属性时
__invoke() 调用函数的方式调用一个对象时的回应方法
__call 和 __callStatic 前者是调用类不存在的方法时执行,而后者是调用类不存在的静态方式方法时执
行
请配合月师傅的代码进行食用
<?php class Str3am{ public $var1 = 'abc'; public $var2 = '123'; public function echoP(){ echo $this->var1.'<br>'; } public function __construct(){ echo "__construct<br>"; } public function __destruct(){ echo "__destruct<br>"; } public function __toString(){ return "__toString<br>"; } public function __sleep(){ echo "__sleep<br>"; // 注意返回带类中所有变量名称的数组 return array('var1', 'var2'); } public function __wakeup(){ echo "__wakeup<br>"; } } // 创建对象,输出__construct $obj = new Str3am(); // 调用 echoP 方法 $obj->echoP(); // 把类当做字符串输出,输出__toStringecho $obj; // 序列化对象,输出__sleep $s = serialize($obj); // O:6:"Str3am":2:{s:4:"var1";s:3:"abc";s:4:"var2";s:3:"123";} echo $s.'<br>'; // 反序列对象,输出__wakeup unserialize($s); // 脚本结束,对象被销毁,输出两个 __destruct,还有一个是 unserialize 恢复的对象 ?>
反序列化漏洞是建立在如上的基础上的
由于反序列化的参数用户可控
用户可以绕过或利用魔术函数在服务器中执行自己的代码
危害极大
这里记录一个__wakeup函数的绕过方式
在序列化代码中__wakeup的个数大于实际的个数就会绕过这个函数

浙公网安备 33010602011771号