PHP反序列化漏洞
首先我们要了解反序列化就要明白什么是序列化
序列化
序列化是一个将对象转化为实例的过程
在php文件中,有的对象内容需要使用,但是使用的频率不高,将代码存放的话会占用系统资源,但是删除则下次使用时就要重新码增加了负担,所以序列化就帮助程序员解决了这个问题,它可以将不常用的代码进行序列化,从而省去了系统的空间,当需要使用这段代码时将代码反序列化就可以接着使用
序列化类似于json格式,有序列化函数:serialize()
示例代码:
<?php class democlass { public $name = "Tony"; public $sex = "man"; public $age = "22"; } $example = new democlass(); $example->name = "John"; $example->sex = "woman"; $example->age = "18"; echo serialize($example); ?>
访问代码后:
O:代表对象
a :表示数组
s:表示字符
反序列化
了解了序列化后就明白反序列化就是将一个实例转为对象的过程
反序列化函数:unserialize()
漏洞如何利用
从上我们可以看出,序列化和反序列化都是非常正常的常用手法,为什么在常见的过程中会出现漏洞呢?这个时候我们就要了解一下php的魔法函数:
_construct() 当一个对象被创建时调用
_destruct() 当一个对象被销毁时调用
_toString() 当一个对象被当作一个字符串使用
_sleep() 在对象再别序列化之前运行
_wakeup() 将在序列化之后调用
当实例转为对象时会触发魔法函数,直接调用执行,所以当我们将一个恶意代码进行序列化后,再进行反序列化就会直接触发执行恶意代码
示例代码:
<?php class S{ public $test = "<img src=x onerror=alert(1)>"; } $a = new S(); echo serialize($a); ?>
执行生成实例代码:O:1:"S":1:{s:4:"test";s:28:"<img src=x onerror=alert(1)>";}
然后将实例进行反序列化
直接执行xss语句,形成反序列化漏洞