这一期我们来说一下php反序列
首先我们来说一下什么是反序列什么是序列化
在我们说到序列化之前还要说一下什么是面向对象,什么是类于对象
在php语言中定义一个类可以是类似于这样

可以看到,这个对象里面有一个成员变量,两个成员函数,其中两个成员函数的属性都是public成员变量的属性是protected
在php中有这些反序列和序列化的函数

这些函数可以改变php中的类与对象的数据结构,说白了,序列化就是将一个对象以一串二进制字符串来表示,反序列化就是将一个二进制字符串变成一个对象
值得注意的是,序列化后的对象,是不包含成员函数的,也就是说序列化后的对象,只会包含成员变量
反序列化绕过小Trick
php7.1+反序列化对类属性不敏感
我们前面说了如果变量前是protected,序列化结果会在变量名前加上\x00*\x00
但在特定版本7.1以上则对于类属性不敏感,比如下面的例子即使没有\x00*\x00也依然会输出abc


绕过__wakeup(CVE-2016-7124)
版本:
PHP5 < 5.6.25
PHP7 < 7.0.10
利用方式:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
对于下面这样一个自定义类


下面我们来看实例

这一题是我之前就已经做出来过的,拿这一题来举例

打开后,我们可以直接看到,这一段php源代码
PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。
当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。
我们可以看到xctf类只拥有一个public的flag变量,值为111,public属性序列化后的格式为:数据类型,属性名长度,“属性名”数据类型:属性值长度:“属性值”。

通过url进行get传参就可以得到flag

题目来自攻防世界
Web类题目,flag都不一样,自己试试吧




没有回复内容