每一天都是新的一天,每一天都会接受新的信息,每一天都会有新的成长,昨天接到一个付费咨询,一直到晚上睡前才记起来,客户是一个大一学生,参加了大学的网络安全社团,然后遇到了一道题目,想求助我帮忙解决~
这题考察的是PHP反序列化,还有对象的构造函数和析构函数,算是Web安全入门题,有兴趣和想法的小伙伴,可以在知乎平台购买Web安全三册,比京东便宜一点,本着助人为乐的精神,就帮助这位小兄弟分析一下~
- 首先是创建一个Test对象
- 然后序列化
- 紧接着echo输出:O:4:"test":1:{s:1:"a";s:4:"test";} (序列化)
- 接下来是接受一个str参数(GET请求)
- 再之后反序列化
- 结束调用析构函数
我们可以先看看这个序列化:O:4:"test":1:{s:1:"a";s:4:"test";}
- O:4是对象名称长度是4 (test)
- 1是 对象有1个属性
- s:1 表示字符长度是1(属性是a)
- s:4 标识字符长度是4(属性a的值是test)

这里的核心是Test对象里面的方法
- __wakeup:咱们要绕过这个反序列化触发的方法,后面分析
- __construct:构造函数,这时候变量a=test
- __destruct:析构方法,如果变量a=flag,咱们就成功了

当我们请求这个网址的时候,由于反序列化,先调用__wakeup方法,导致变量a=NOflag,那么最后析构的时候,由于不满足a=flag,导致我们拿不到结果~
那么我们的思路就是如何构造请求参数str,让这个变量a=flag,这里我们首先破坏__wakeup方法的执行,然后将实例化时候的test参数,改成flag即可~
我们自己可以构造这样的序列化来获取flag:O:4:"test":2:{s:1:"a";s:4:"flag";}
- O:4是对象名称长度是4 (test)
- 2是 对象有2个属性(改变了属性真实个数,破坏了反序列化时__wakeup方法调用)
- s:1 表示字符长度是1(属性是a)
- s:4 标识字符长度是4(属性a的值是flag)
这里有一点绕的是,对象是test,然后参数也是test,可能刚刚上大学的小朋友,有点搞不清楚,多看看书,多看看博客,你看的比别人多,你就比别人厉害,信息安全就是信息差~

Web安全入门其实很简单,就是要不停的学习,不停的记特性,不停的折腾,总有一天,你会发现,别人都喊你大神,大佬,光头强的时候,你就会突然明白,原来信息安全真的很简单~