反序列化unserialize 及实例

在 PHP 中,serializeunserialize 是两个用于处理数据的函数,主要用于将 PHP 的数据类型(如数组和对象)转换为字符串格式,以及将字符串格式的数据转换回 PHP 的数据类型。

(可以想象网购的场景,serialize就是商家包装商品,unserialize就是你拆快递,还原商品)

先粗略了解一下serialize

serialize()

serialize() 函数将一个 PHP 值转换为一个可存储或传输的字符串。这个字符串可以被 unserialize() 函数恢复为原来的 PHP 值。常用于将复杂数据(如数组或对象)存储到数据库或文件中,或在会话中保存状态。

​
<?php
$data = [
    'name' => 'Alice',
    'age' => 25,
    'is_student' => false
];

// 序列化数组
$serialized_data = serialize($data);
echo "Serialized Data: " . $serialized_data . "\n";
?>

​

$data 是要被序列化的PHP值(可以是数组,对象,字符串等)

​
//输出:

Serialized Data: a:3:{s:4:"name";s:5:"Alice";s:3:"age";i:25;s:10:"is_student";b:0;}

​

unserialize()

unserialize() 函数将一个经过 serialize() 处理的字符串转换回原来的 PHP 值(数组或对象)。

mixed unserialize(string $str);
  • 参数$str 是要被反序列化的字符串,它必须是通过 serialize() 生成的。
  • 返回值:返回原来的 PHP 值(如数组、对象等),如果字符串无效,则返回 false

示例

<?php
$serialized_data = 'a:3:{s:4:"name";s:5:"Alice";s:3:"age";i:25;s:10:"is_student";b:0;}';

// 反序列化字符串
$data = unserialize($serialized_data);

print_r($data);
?>
//输出:

Array
(
    [name] => Alice
    [age] => 25
    [is_student] => 
)

 

unserialize() 函数用于将序列化字符串转换回 PHP 值(通常是对象、数组等)。在这个过程中,魔术方法 __wakeup() 会被调用。其作用是允许开发者在对象没有被完全构造时进行一些设置或恢复操作。

常见的魔法函数

 

  1. __construct():构造方法,在对象实例化时调用,用于初始化对象属性

    public function __construct($param) { // 初始化代码 }
  2. __destruct():析构方法,在对象销毁时调用,通常用于释放资源。

    public function __destruct() { // 清理代码 }
  3. __call($name, $arguments):当调用未定义或不可访问的方法时调用。

    public function __call($name, $arguments) { // 处理未定义方法的逻辑 }
  4. __get($name):当试图访问未定义或不可访问的属性时调用。

    public function __get($name) { // 返回属性值 }
  5. __set($name, $value):当试图设置未定义或不可访问的属性时调用。

    public function __set($name, $value) { // 设置属性值 }
  6. __isset($name):当调用 isset()empty() 函数检查未定义或不可访问的属性时调用。

    public function __isset($name) { // 返回属性是否存在 }
  7. __unset($name):当调用 unset() 函数试图删除未定义或不可访问的属性时调用。

    public function __unset($name) { // 处理删除属性的逻辑 }
  8. __toString():当试图将对象当做字符串使用时调用,通常用于定义对象的字符串表示。

    
    public function __toString() { return "字符串表示"; }
  9. __invoke():允许对象被当作函数调用。

    public function __invoke($arg) { // 处理函数调用 }
  10. __sleep()__wakeup():用于序列化和反序列化对象。

    • __sleep() 在对象序列化时调用,用于返回要序列化的属性名。
    • __wakeup() 在对象反序列化时调用,用于执行重新初始化操作。

想深入了解序列化和反序列化的可以看这些大佬写的博客:

​​​​​​深度剖析PHP序列化和反序列化

反序列化(Unserialize)漏洞详解

unserialize()实例 

 以攻防世界这道题为例:unserialize3

 8976a0c5af014da49536c746aac4d8c7.png

补充完整(个人用的是vscode)

31eb0b9fc2d8421f87f26499039ffcad.png

 然后保存,在浏览器打开(我是将该文件移到phpstudy的WWW目录下再在浏览器打开,phpstudy下载可以看这位博主的PhpStudy下载安装使用教程,图文教程(超详细))

 265e667ad7eb431c85cebb3e93078475.png

O代表object(为A时代表Array),4代表"xctf"占4个字符长度,1代表着对象具有一个个变量,(此处有两个:flag和111,所以在URL中要进行改动),s代表string,字符型(如果为i,代表int型)

为了绕开__wakeup,将“1”改为“3”或者更大的数字(当序列化字符串表示对象属性个数的值大于真实个数的属性就会跳过wakeup)

 

2de56b139fd2414a8f8fa4e3c6e82ba8.png

 

 

 欢迎评论区纠正与补充

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值