2026黄鹤杯(学生组)—ezz_upload复现

发布时间:2026/7/31 14:04:58
2026黄鹤杯(学生组)—ezz_upload复现
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加入简单的命令执行代码示意sectionh1Preview/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这样的结构导致验证失败。正确做法是进入文件夹内部 CtrlA 全选 → 右键压缩。3.3 上传与触发浏览器刷新页面 → 识别图片验证码 → 选择 zip 包 → 上传看到绿色提示Theme installed → 点击预览主题页面会呈现预览结果——也包括我们插进去的 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 后从字面量中提取到的 flagflag{****-****-****-****-****-****-****}脱敏。反例一个简单的文件被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 的乐趣在于思考路径分享思路是件好事但切记只在有授权的环境下练习。如果你觉得本文有帮助欢迎点赞收藏有问题欢迎在评论区交流。