php序列化与非序列化
0x00 基础知识
讲的超详细:https://www.cnblogs.com/youyoui/p/8610068.html
重点摘抄:
1、序列化对象时,不会保存常量的值。对于父类中的变量,则会保留。
2、当调用serialize()
函数序列化对象时,该函数会检查类中是否存在一个魔术方法__sleep()
。如果存在,该方法会先被调用,然后才执行序列化操作。可以通过重载这个方法,从而自定义序列化行为。
3、若被反序列化的变量是一个对象,在成功重新构造对象之后,PHP会自动地试图去调用__wakeup()
成员函数(如果存在的话)
0x01实践
xctf_unsealize3
打开网址可以看到
关于非序列化字符串的构造可直接写代码执行一下它的序列化,也可手动构造,我是手动构造的:O:4:"xctf":1:{s:4:"flag";s:6:"111";},O表示对象,s表示字符串
由上可知,反序列化的若为对象,且存在_wakeup()成员函数,会自动调用,想办法绕过,百度可知当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
所以可构造:O:4:"xctf":2:{s:4:"flag";s:6:"111";}:
0x03 总结
php语言果然是一门神奇的语言