2026黄鹤杯(学生组)—ezz_upload复现
2026/7/31 14:04:35 网站建设 项目流程

CTF 靶场实战:一次"主题预览"上传点的 RCE 思路分享

前言

本篇文章记录的是一次已授权Web 靶场的文件上传类题目解题思路,目标是拿到服务器中的 flag。所有操作均在合法演练环境中进行,文中 token 部分已做脱敏处理,请勿对未授权系统做任何尝试。

一句话总结:题目只拦了"危险后缀"和"控制文件",但主题包自带的模板文件本身就能执行——这是这道题最隐蔽的突破口。

一、靶场基本信息

打开靶场,看到一个"主题预览中心"页面:

  • 允许上传.zip主题包
  • 服务端有图形验证码
  • 上传后会提示"主题已安装",并提供"预览主题"链接

下载官方提供的示例主题包demo-theme.zip,解压看结构:

demo-theme/ ├── manifest.json # 元信息(含 title / tagline) ├── preview.tpl # 预览模板(关键点) └── assets/ └── cover.png # 封面图(1×1 像素)

二、信息收集:发现关键特征

查看preview.tpl文件内容:

<section> <h1><?= h($themeTitle) ?></h1> <p><?= h($themeTagline) ?></p> </section>

注意这一行:<?= h($themeTitle) ?>,这是 PHP 的短标签语法。说明这个模板文件是被 PHP 引擎解析执行的(通常是include进来渲染)。

再打开页面源码看一下服务端的过滤逻辑,可以注意到(解压示例包中的源码也能看到类似处理):

类型

处理

危险后缀

.php/.phtml/.pht/.phar等被黑名单拦截

控制文件

.htaccess/.user.ini/web.config等被拦截

preview.tpl

必需的白名单文件(不做黑名单过滤)

这意味着,只要包含恶意 PHP 代码的preview.tpl还是个"合法的主题包",就能绕过上传过滤器。

三、利用思路

核心思路:在preview.tpl中插入 PHP 代码 + 重新打包 zip + 上传后预览 → 触发 PHP 执行。

3.1 构造模板 payload

修改preview.tpl,加入简单的命令执行代码(示意):

<section><h1>Preview</h1></section> <?php // 这部分代码会被服务端 include 时执行 echo shell_exec('id'); echo shell_exec('cat /entrypoint.sh'); ?>

3.2 完整 zip 包结构

zip 包的根目录必须直接包含以下三个文件名(注意路径层级):

your_package.zip ├── manifest.json ├── preview.tpl ← 含 PHP payload └── assets/ └── cover.png

常见踩坑点:用 Windows 资源管理器直接右键压缩外层文件夹时,zip 内会变成your_package/manifest.json这样的结构,导致验证失败。正确做法是进入文件夹内部 Ctrl+A 全选 → 右键压缩

3.3 上传与触发

  1. 浏览器刷新页面 → 识别图片验证码 → 选择 zip 包 → 上传
  1. 看到绿色提示"Theme installed" → 点击"预览主题"
  1. 页面会呈现预览结果——也包括我们插进去的 PHP 输出

四、看到 RCE 输出后的策略

执行后应当按"探测→决策"两步走,而不是一上来就去读目标文件。原因很简单:很多关键信息藏在"题源"或"部署脚本"里,最先读哪里往往决定了整体方案是简单还是复杂。

我的探测顺序:

① id → 看当前用户身份(root / www / ctf ...) ② ls -la / → 找 flag 文件、看权限 ③ cat /entrypoint.sh → 看启动脚本(容器/CTF 必看!) ④ find / -iname "*flag*" → 全盘搜

这道题的entrypoint.sh中就明文包含了printf 'flag{****-****-****-****-********}' > /flag这种启动时把 flag 写到文件的逻辑——这通常意味着 flag 字符串本身就以字面量形式出现在源文件里。

拿到 entrypoint.sh 后,从字面量中提取到的 flag:flag{****-****-****-****-****-****-****}(脱敏)。

反例:一个简单的文件被chmod 400设置成 root only,多数人第一反应是去提权。但cat /entrypoint.sh这种题源文件看看——很多时候根本不需要提权。

五、技术点总结

知识点

说明

PHP 短标签<?= ?>

文件被include后即可执行

上传黑白名单绕过

白名单必需文件天然绕过黑名单

SVG 验证码

字面在<text>节点中,按x排序即明文

容器/CTF 部署文件

往往包含flag字面量,cat即可

zip 目录树错位

压缩层级不对会触发"missing required theme file"

六、复盘 & 反思

这道题我自己在解的过程中绕了一个远路——看到/flag权限是chmod 400 root就反射性去想"提权链",其实完全没必要。entrypoint.sh 中明文就有 flag 字面量,源码对当前用户可读,最简单的方式是一步到位。

教训:对 Web 靶场拿到 RCE 后的第一步,应该是搜索题源/源码/部署文件,而不是直接冲文件树深处的某个目标。chmod 400这类权限提示,往往只是题面的"虚假难度"。

七、合规声明

本文所有操作均在已授权合法演练环境进行。文中给出的 payload 为教学示例,未给出能直接一键攻破任何公开服务的完整脚本。请勿将文中的方法用于未授权系统测试。所有因非法使用产生的后果与本文作者无关。


作者注:CTF 的乐趣在于思考路径,分享思路是件好事,但切记只在有授权的环境下练习。如果你觉得本文有帮助,欢迎点赞收藏,有问题欢迎在评论区交流。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询