攻防世界-unserialize3
序列化和反序列化
序列化通俗来讲就是将对象转化为可以传输的字符串;
反序列化就是把那串可以传输的字符串再变回对象。
例子:
<?php
class chybeta{
var $test = '123';
}
$class1 = new chybeta; //这里就是创建啦一个新的对象
$class1_ser = serialize($class1); //将这个对象进行字符串封装,就是对其进行序列化
print_r($class1_ser);
?>
来解释一下:O:7:"chybeta":1:{s:4:"test";s:3:"123";}
这里的O呢就是object对象的意思,数字7代表着对象的函数名有7个占位,然后就是对象名了
这个数字1表示对象里有一个变量,大括号里的s代表的是string类型还有一个i是int型
再使用反序列化函数,结果print为chybeta Object([test] => 123)
原文链接:https://blog.csdn.net/LTtiandd/article/details/99591998
魔法函数
题目分析
访问看到
明显需要看出需要绕过__wakeup函数才行,?code表名使用GET方法传参数__
code可能是XCTF类序列化再反序列化的结果
_wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
所以将对象数改成1以上的值就可以,也就是XCTF后的2,表示的是类中的变量的个数。
payload: ?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
参考:(3条消息) 攻防世界-unserialize3_魔术函数,以及wakeup()函数的绕过_Kvein Fisher的博客-CSDN博客