引文
上一篇给大家带来了XSS跨站脚本攻击漏洞不知道大家学的咋样了,今天给大家带来另一个漏洞,PHP的反序列化漏洞,这也是我在CTF比赛中遇到过最多的也是比较考察逻辑思维的一种漏洞。
简介
PHP反序列化是一个非常常见的漏洞,利用难度相比于文件上传等漏洞相对较困难,漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。
基础知识
在了解反序列化之前先看看反序列化与序列化:
序列化
序列化就是将 对象object、string、array、变量 转换成具有一定格式的字符串,方便保持稳定的格式在文件中传输,以便还原为原来的内容。这个应该很好理解,学过JAVA反序列化的可以按照JAVA的去理解,只不过用到的函数不一样罢了,下面是一个序列化的例子:
<?php class XINO{ var $test = '123456'; } $class1 = new XINO; $class1_ser = serialize($class1); print_r($class1_ser); ?>
输出字符串:
O:4:"XINO":1:{s:4:"test";s:6:"123456";}
O代表存储的是对象(object),4表示有4个字符,XINO表示对象名,1表示有一个值,括号里的以此类推。
反序列化
与序列化相对应,从序列化后的结果中恢复对象(object)。用法和上面的序列化函数差不多,只是作用相反,会恢复被序列化的字符串流。函数为:unserialize。
属性
了解完序列化与反序列化,下一个要了解的我认为是php的属性,有基础的小伙伴可能会知道php的属性有:public(公有),protected(受保护)或 private(私有)。
由于变量的属性不同,序列化后的结果也会有一些细微的差异,这是要十分记住的点,也是个人在学习中经常出错的点:
public:属性被序列化的时候属性值不会更改。
protected:属性被序列化的时候属性值会变成