这道题主要是考察大家反序列化的知识,我们先来进入一下题目

通过观察,在这里有一个wakeup()函数,我们就可以得知这是一个反序列化的漏洞
在这里我们先介绍一下什么叫序列化,
序列化指的是:是将变量转换为可保存或传输的字符串的过程,反序列化就是一个相反的过程
PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。
当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。
所以在这道题目中,我们需要去确认一下该序列化字符串的属性值
那么我们该如何去实现呢?诶,我们可以通过serialize()函数来获取属性值
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$code = new xctf(); //使用new运算符来实例化类xctf的对象为code
echo(serialize($code));
?>
我们运行这个代码块:

我们得到了上面这段字符串,乍一看还挺复杂,我来解释一下:
O:表示被序列化的是一个对象
4:表示对象名 xctf 有4个字符
"xctf":表示对象的名称为 xctf
1:表示该对象只有一个属性
{}:表示该对象的属性列表为空
s:表示属性类型为字符串
4:表示属性名 flag 有4个字符
"flag":表示属性名为 flag
s:表示属性类型为字符串
3:表示属性值 111 有3个字符
"111":表示属性值为 111

如果我们按照上图的方式,直接将获取的字符串输入进去,发现wakeup()函数成功的调用了,为了让他不被使用,我们可以将里面的属性值1改成其他任意大于他的数字就可以获得flag
即:

如果你将属性值改成0的话还是会报错的:

如果不明白为什么,请往上面翻一下,上面有记录什么是php反序列化。
文章讲述了如何通过PHP中的反序列化过程,利用__wakeup函数的特性,检测并修改序列化字符串中的属性值,以避免__wakeup函数的执行。重点介绍了序列化和反序列化的概念以及如何利用serialize()函数获取和修改属性值。
1万+

被折叠的 条评论
为什么被折叠?



