魔术php
① 2021强网杯 [强网先锋]赌徒-php反序列化复现过程
本文以2021强网杯 [强网先锋]赌徒为例,深入解析PHP反序列化漏洞的复现过程,旨在提供对PHP源代码审计和漏洞理解的深入洞察。试验环境包括虚拟机和浏览器等工具,以构建实验环境并进行漏洞复现。
构建实验环境的步骤包括下载和安装Centos7.9操作系统、配置网络参数、安装phpstudy,以及搭建网站环境。通过下载并安装“小皮面板”工具,选择无docker版本,并执行命令行操作进行环境配置。在浏览器中输入指定IP访问网站,测试网站功能,确保环境搭建成功。
构建“2021强网杯 [强网先锋]赌徒”考试环境的关键是利用魔术函数构建复杂对象结构。在根目录下,通过创建flag文件并设置内容,以及在网站目录建立包含魔术函数的index.php文件,构建了实验环境的核心代码逻辑。通过小皮面板设置,确保实验环境构建无误。
解题思路中,首先访问试题网址进行初步分析,使用dirsearch.py进行网站目录扫描,下载并打开压缩文件,发现包含关键代码的index.php文件。通过分析源代码,发现本题属于PHP反序列化漏洞,关键在于利用魔术函数触发特定行为,最终获取flag。
序列化与反序列化是对象状态转换的两大过程,前者将对象状态转化为可存储或传输的字符串,后者则将字符串恢复为原对象。PHP中的魔术方法如__construct、__destruct、__toString等,为构造EXP提供了便利。通过构建一个简单的person类实例,序列化后输出对象状态,展示了序列化过程。
利用反序列化进行攻击的关键在于构造特定的序列化字符串,触发魔术方法执行恶意代码。以Start、Info和Room类构建复杂对象结构,通过调用特定魔术方法,最终获取flag文件的Base64编码。此过程包括对象的创建、属性的设定、魔术方法的调用,以及最终的序列化输出。
编写PHP代码生成序列化字符串,并在浏览器中执行,输出序列化值。注意处理private变量序列化时需要添加%00以绕过访问限制。使用base64 decode工具解码输出的字符串,获取flag。确保执行序列化字符串时不进行URL编码,以免影响执行效果。
总结,PHP反序列化复现过程涉及深入理解魔术函数、对象创建、属性设定及序列化反序列化原理。通过构建复杂对象结构,利用魔术方法触发特定行为,最终获取flag。此过程不仅考验了对PHP语言特性的理解,也锻炼了利用漏洞进行渗透测试的能力。愿读者通过本案例学习,不断进步。
② PHP中常用的11个魔术方法
在PHP中,常用的11个魔术方法及其功能概述如下:
__get 和 __set
- __get:用于获取未声明的属性。
- __set:用于设置未声明的属性。
- 这两个方法特别适用于处理私有或受保护属性的访问。
__isset 和 __unset
- __isset:用于检查未定义的属性是否存在。
- __unset:用于删除未定义的属性。
- 这两个方法也处理私有或受保护属性的访问控制。
__call
- 当尝试调用未声明的方法时,此方法会被调用。
- 对于实现方法重载或执行自定义行为非常有用。
__autoload
- 自动加载类的功能。
- 当尝试使用尚未定义的类时,此方法会被调用,允许在类未被直接加载前加载它们。
__construct 和 __destruct
- __construct:构造方法,在实例创建时执行,用于初始化对象。
- __destruct:析构方法,在对象销毁时执行,用于释放资源。
__clone
- 在对象复制时,此方法被自动调用。
- 使用clone语句复制对象时,用于执行任何额外的初始化操作。
__toString
- 当尝试将对象转换为字符串时,此方法会被调用。
- 确保对象可以被正确显示。
__sleep 和 __wakeup
- __sleep:在对象序列化前执行,用于清理不需要存储的对象状态。
- __wakeup:在反序列化后执行,用于重建任何被序列化时丢失的资源。
__set_state
- 当调用var_export函数时,此方法被调用。
- 用于反序列化对象状态。
__invoke
- 当尝试以函数调用方式调用对象时,此方法被自动调用。
- 实现对象作为函数的使用。
__callStatic
- 与__call方法类似,但用于处理静态方法的调用。
- 确保静态方法的正确执行。
这些魔术方法极大地增强了PHP类的灵活性和功能,允许开发者以更简洁的方式实现复杂的功能。在使用时,应确保所有魔术方法都被定义为公共的,以确保它们的正确执行。
