在做题之前我们先了解一些序列化和反序列化的知识
序列化是一种将数据结构或对象转换为便于存储、传输或表示的字符串的过程,反之则是将字符串解析为原始的数据结构或对象。在PHP中,我们可以使用serialize()函数将一个变量序列化为字符串,使用unserialize()函数将字符串反序列化为原始的数据结构或对象。
题目中还出现了__wakeup,它是一种魔术绕过
wakeup()有个执行漏洞,在这道题中很关键:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数。(在序列化后立即调用)
提示用code=进行传参
序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
因此需要把O:4:"xctf":1:{s:4:"flag";s:3:"111";},更改为O:4:"xctf":2:{s:4:"flag";s:3:"111";},使表示对象属性个数的值与真实的属性个数的值相同。
得到flag