网安基础学习笔记:PHP类与对象及反序列化漏洞核心

张开发
2026/4/11 12:32:57 15 分钟阅读

分享文章

网安基础学习笔记:PHP类与对象及反序列化漏洞核心
作为网安初学者PHP是绕不开的核心知识点之一尤其是类与对象、序列化与反序列化不仅是PHP基础更是后续挖掘反序列化漏洞的关键。我结合自己的学习笔记整理了这篇入门内容适合和我一样刚接触网安的小伙伴一起夯实基础避开常见安全坑。一、PHP核心基础类与对象在PHP中类与对象是面向对象编程的核心也是理解后续反序列化漏洞的前提先把基础概念吃透再谈漏洞就会轻松很多。1. 核心概念拆解类对象的“抽象模板”相当于一个“蓝图”定义了对象具备的属性数据和方法行为。比如“用户类”就可以定义用户的姓名、年龄属性以及登录、获取信息方法。对象类的“具体实例”是根据类这个“蓝图”创建出来的实体。比如根据“用户类”创建出“张三”这个具体的用户对象张三的姓名、年龄就是这个对象的具体数据。属性类中定义的变量专门用来存储对象的数据。比如用户对象的$name姓名、$age年龄都是属性用来描述对象的特征。方法类中定义的函数用来实现对象的功能。比如用户对象的getInfo()获取用户信息、login()用户登录通过方法实现对象的具体行为。$this类内部的“当前对象引用”相当于对象的“自我指针”用来在类内部访问当前对象的属性和方法。比如在类中用$this-name就能访问当前对象的$name属性。2. 简单示例下面是一段简单的PHP代码可以把上面的概念串联起来看如果有不会的也欢迎私信我~?php // 定义一个用户类模板 class User { // 定义属性存储数据 public $name; public $age; // 定义方法实现功能 public function getInfo() { // 用$this访问当前对象的属性 return 姓名 . $this-name . 年龄 . $this-age; } public function login() { echo $this-name . 登录成功; } } // 创建对象类的具体实例 $user1 new User(); $user1-name 张三; $user1-age 20; // 调用对象的方法 echo $user1-getInfo(); // 输出姓名张三年龄20 $user1-login(); // 输出张三 登录成功 ?二、序列化与反序列化序列化与反序列化是PHP中对象持久化、数据传输的核心机制但也是反序列化漏洞的根源。简单来说就是“对象的打包与解包”过程。1. 核心定义序列化将内存中的对象状态属性、值等转换为可存储如写入文件或可传输如网络传输的格式通常是字节流或字符串的过程。目的是保存对象的状态方便后续使用。反序列化将序列化后的数据如字符串恢复为内存中原来的对象的过程。相当于把“打包好的对象”解包还原成可操作的对象实例。2. 核心函数实操必备PHP提供了两个核心函数实现序列化与反序列化直接上手实操1序列化函数serialize()作用将变量通常是对象序列化为字符串可配合var_dump()输出查看序列化结果。?php class User { public $name 张三; public $age 20; } $user new User(); // 序列化对象并用var_dump输出结果 var_dump(serialize($user)); ?运行结果如下图序列化后的字符串string(52) O:4:User:2:{s:4:name;s:6:张三;s:3:age;i:20;}序列化后的字符串包含了类名、属性数量、属性名和属性值是后续反序列化的核心数据2反序列化函数unserialize()作用将序列化后的字符串恢复为原来的对象可直接操作该对象。?php class User { public $name 张三; public $age 20; } $user new User(); // 先序列化再反序列化 $serialized serialize($user); $unserialized unserialize($serialized); // 反序列化后可正常调用对象的方法 var_dump($unserialized-getInfo()); // 输出对象的信息 ?补充实际开发中序列化常用于数据缓存、跨页面传输但在网安领域一旦反序列化的数据被攻击者控制就会引发严重漏洞。三、反序列化漏洞触发核心对于网安初学者来说重点不是掌握序列化的用法而是理解“反序列化漏洞”的触发机制这是后续挖洞、防护的关键。而漏洞的核心就和PHP的魔术方法密切相关。1. 先懂魔术方法漏洞触发的“开关”PHP中的魔术方法是以两个下划线__开头的特殊方法不需要手动调用会在特定场景下自动触发。其中和反序列化漏洞最相关的就是__wakeup()方法。魔术方法的触发场景new实例化对象时会触发__construct()反序列化时会触发__wakeup()对象被销毁时会触发__destruct()。2. __wakeup()反序列化漏洞的核心入口触发机制当调用unserialize()函数对数据进行反序列化时会自动执行对象所属类中的__wakeup()方法如果该方法存在。核心作用正常情况下用于反序列化后重建对象状态、恢复资源比如重新连接数据库、数据校验是PHP提供的“安全机制”。安全重点漏洞关键正因为__wakeup()会自动执行一旦攻击者控制了反序列化的数据就可能利用该方法执行危险操作比如调用系统命令、写入恶意文件从而引发漏洞。因此开发时必须避免在__wakeup()中执行危险操作同时做好输入校验。3. 漏洞示例以下是一个简单的漏洞代码示例帮助理解漏洞触发过程实际漏洞会更复杂但核心逻辑一致?php class Evil { public $cmd; // 反序列化时自动执行__wakeup() public function __wakeup() { // 危险操作执行系统命令 system($this-cmd); } } // 攻击者构造恶意序列化字符串控制$cmd的值 $payload O:4:Evil:1:{s:3:cmd;s:10:id;whoami;}; // 反序列化触发__wakeup()执行恶意命令 unserialize($payload); ?上述代码中攻击者通过构造序列化字符串控制了$cmd的值反序列化时自动执行__wakeup()调用system()函数执行恶意系统命令从而控制服务器。四、拓展高危函数与漏洞补充结合反序列化漏洞补充几个网安学习中必记的高危函数和漏洞类型这些都是后续挖洞时经常遇到的“攻击点”。1. 高危函数禁止随意使用system()直接执行系统命令属于高危危险函数一旦被攻击者利用可直接控制服务器开发时需避免使用或严格校验输入。代码执行函数如eval()、exec()可直接执行传入的字符串作为PHP代码极易被攻击者利用导致服务器被完全控制生产环境中需禁用这类函数可通过php.ini配置禁用。2. 文件包含相关常见漏洞类型文件包含通过include()、require()函数将另一个文件的内容复制到当前文件中并执行是PHP中常用的功能。远程文件包含若include()、require()函数的参数的是远程文件路径且参数可控就会形成远程文件包含漏洞攻击者可包含远程恶意文件执行恶意代码。文件包含漏洞核心是“参数可控”攻击者可在URL中通过参数直接指定要包含的文件如恶意脚本从而执行恶意代码控制网站。五、学习小结作为网安初学者学习PHP类与对象、序列化与反序列化核心是抓住“漏洞触发点”先夯实基础理解类、对象、属性、方法、$this的核心概念能看懂简单的PHP面向对象代码掌握核心机制明白序列化是“打包”、反序列化是“解包”记住两个核心函数的用法重点突破漏洞牢记__wakeup()的触发机制理解“反序列化危险操作”如何形成漏洞牢记高危函数禁用或严格控制system()、eval()等高危函数避免人为引入漏洞。后续会继续深入学习反序列化漏洞的具体利用方法和防御措施也欢迎和我一样刚入门网安的小伙伴一起交流查漏补缺共同进步本文为网安基础学习笔记若有错误欢迎各位大佬指正~

更多文章