1.信息收集:
从题目unserialize: 考察反序列化;
2.按照思路:
代码审计:
<?php
class xctf{
public $flag = '111';
public function __wakeup(){ //_wakeup()是魔法函数,被反序列化时立即被调用
exit('bad requests'); //这里没有被反序列化,根本不运行魔法函数
}
}
$x= new xctf(); //创建新对象
print(serialize($x)); //对对象序列化输出
?>
运行代码结果:
这是我们序列化后的结果;
我输入这段字符,被反序列化调用了魔法函数,它是怎么被反序列化的?
可能服务器上的代码在处理该请求时执行力反序列化操作,题目名称就叫反序列化;
现在我们做的是怎样绕过或不让它反序列化?重点!!!
当被反序列化的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时__wakeup也会失效;
它是怎么个机制?怎么知道我改变了属性个数的?
当对象被序列化时,会将对象的属性和属性值存储在序列化的字符串中。当使用unserialize()函数对序列化的字符串进行反序列化时,PHP会尝试将存储的属性和属性值重新赋值给对象。如果反序列化的字符串中的属性个数与对象的属性个数不匹配,PHP会抛出一个错误,反序列化失败。
改变属性个数尝试:改为3,可以不等于1的正整数(与原来值不一样)就可以;
最终得到了flag;
相关知识点:
1.什么是反序列化,序列化?
序列化和反序列化是将数据结构或对象转换为可存储或传输的格式,以便在需要时可以重新创建它们的过程。序列化将数据结构或对象转换为字节流或字符串,而反序列化将字节流或字符串转换回原始数据结构或对象。例如,当我们将数据从一个应用程序发送到另一个应用程序时,我们需要将数据序列化为可传输的格式,然后在另一个应用程序中反序列化它以将其还原为原始数据结构或对象。
那每次用一个应用程序发送数据到另一个应用程序时是否都要序列化呢?
不是,序列化或非序列化方式进行数据传输,具体选择哪种方式取决于不同因素,包括数据类型,传输需求和所使用的通信协议等;
序列化传输:传输的数据是很复杂,或者需要跨平台传输,通常选择序列化传输,例如对象转换为字节流,JSON,XML等。
非序列化传输:传输的数据简单数据类型(如整形,字符串等),或应用程序已经约定好了一种特定的数据格式,那么可以直接将数据以原始的格式进行传输,无需序列化。
总之,序列化像一种翻译,就像陌生人之间交流,我们会选择对方能听懂的语言,想方设法让对方能听懂,如果你和我熟悉,可能你和我之间有一套独特的交流方式,这对他人来说复杂的,我们转换成他人(另一个,不同的,不认识的平台)能听懂得的语言,最好是广泛应用的语言;序列化就是不同的平台都能听懂;
2.为什么要序列化?PHP序列化的好处在哪?
序列化就是不同的语言环境中也能让对方听懂,这样以便传输;
序列化是将一个对象或数据结构及其内容换成可存储或传输的格式的过程。序列化的好处在于可以将对象或数据结构及其内容保存到硬盘或通过网络传输到其他机器,而不需要重新构造对象或数据结构及其内容。PHP序列化是指将PHP对象或数据结构转换成字符串,以便在不同的环境中传输或存储。
PHP序列化的好处在于:
1. 方便数据传输:PHP序列化可以将PHP对象或数据结构转换成字符串,方便在网络上传输或存储到文件中。
2. 节省资源:序列化可以将一个对象或数据结构转换成一个字符串,占用的内存资源更少,可以节省服务器的内存消耗。
3. 简化代码:PHP序列化可以简化代码,将复杂的对象或数据结构转换成简单的字符串,便于处理和传输。
总之,PHP序列化是一种非常方便的数据处理方式,可以方便地将PHP对象或数据结构转换成字符串,以便在不同的环境中传输或存储。
3.数据结构是否包含数据内容?
数据结构不包括具体的数据内容,它只描述了数据的组织方式和数据之间的关系。数据结构定义了数据元素之间的逻辑关系,以及数据元素的存储方式和访问方法,但并没有包含具体的数据内容。数据结构只是为了更好地组织和管理数据,使得数据的访问和操作更加高效和方便。因此,在实际应用中,数据结构和数据内容是分开存储和处理的。

以下是一些常见的PHP魔法函数:
__construct: 类的构造函数,在对象被创建时自动调用。
__destruct: 类的析构函数,在对象被销毁时自动调用。
__get: 当调用一个不存在的属性时自动调用。
__set: 当给一个不存在的属性赋值时自动调用。
__call: 当调用一个不存在的方法时自动调用。
__toString: 当对象被转换为字符串时自动调用。
__sleep: 当对象被序列化时自动调用。
__wakeup: 当对象被反序列化时自动调用。
__wakeup魔法函数被反序列化时调用:
<?php
class xctf {
public $flag = '111';
public function __wakeup() {
exit('bad requests');
}
}
$x = new xctf();
$serialized = serialize($x);
echo $serialized;
$unserialized = unserialize($serialized);//被反序列化时调用__wakeup()魔法函数
?>
运行结果: