XCTF unserialize3
一.根据题目猜测这道题应该和反序列化漏洞有关
1.先了解一下什么是序列化和反序列化
当在php中创建了一个对象后,可以通过 serialize() 函数把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。
与 serialize() 相反的就是反序列化函数 unserialize() ,它可以将一个字符串转变为相对应的php对象。
在序列化过程中会用到的函数:
- __construct():当对象创建(new)时会自动调用。但在 unserialize() 时是不会自动调用的。(构造函数)
- __destruct():当对象被销毁时会自动调用。(析构函数)
- __wakeup():unserialize() 时会自动调用。
- __sleep() 在对象被序列化之前运行。
- __toString ()当一个对象被当作一个字符串使用。
从序列化到反序列化这几个函数的执行过程是:
先调用__construct()->__sleep->__wakeup()->__toString ()->__destruct()
2.实验步骤:
打开后通过代码发现是创建一个类
public属性序列化后格式为:数据类型:属性名长度:"属性名";数据类型:属性值长度:"属性值"
我们试着将其序列化:得到 O:4:"xctf":1:{s:4:"flag";s:3:"111";}
wakeup()漏洞就是与整个属性个数值有关。
当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过wakeup的执行。
我们要反序列化xctf类的同时还要绕过wakeup方法的执行否则 将会输出bad requests
我们构造 O:4:"xctf":2:{s:4:"flag";s:3:"111";}
拿到flag。
趁着年轻,多学些