php反序列化漏洞,又叫php对象注入漏洞,是一种常见的漏洞,在我们进行代码审计以及CTF中经常能够遇到。
01学习前最好提前掌握的知识
PHP类与对象PHP魔术方法serialize()与unserialize()02序列化与反序列化
PHP(从PHP3.05开始)为保存对象提供了一组序列化和反序列化的函数:serialize、unserialize。
serialize()
当我们在php中创建了一个对象后,可以通过serialize()把这个对象转变成一个字符串,用于保存对象的值方便之后的传递与使用。测试代码如下:
测试结果:
unserialize()
与serialize()对应的,unserialize()可以从序列化后的结果中恢复对象(object),我们翻阅PHP手册发现官方给出的是:unserialize—从已存储的表示中创建PHP的值。我们可以直接把之前序列化的对象反序列化回来来测试函数,如下:
03反序列化漏洞
由前面可以看出,当传给unserialize()的参数可控时,我们可以通过传入一个精心”构造的序列化字符串,从而控制对象内部的变量甚至是函数。
利用构造函数等
Magicfunction
php中有一类特殊的方法叫“Magicfunction”,就是我们常说的魔术方法这里我们着重