VNCTF2022 - Web - GameV4.0

AI-摘要
Microsoft Xiaoice's GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
VNCTF2022 - Web - GameV4.0
Hunter题目信息
| 项 | 内容 |
|---|---|
| 比赛 | VNCTF2022 公开赛 |
| 方向 | Web |
| 难度 | Easy |
| 环境 | 授权靶场(已脱敏) |
| 服务器 | openresty(纯静态前端 + Vue 推箱子游戏) |
信息收集
访问根路径返回一个名为 boxboy 的推箱子游戏(Sokoban),基于 Vue 构建,加载了多个 JS 文件:
1 | js/data.js js/index.js js/item.js js/base.js |
题目描述「你会踩冰块吗?」暗示是「踩冰块」推箱子谜题。注意后端 PHP 端点(login/ 目录)在这套环境里未部署,返回 404,说明 flag 不依赖后端。
漏洞分析
- 前端 JS 源码审计
- 多层编码(base64 + URL 编码)
攻击链总览(源 wp 原链转写):
1 | 访问首页 → 识别为 boxboy 推箱子游戏(Vue 前端) |
下载所有 JS 文件,js/data.js 最大(77KB),包含全部关卡数据。搜索 flag 关键字,发现关键位置:
1 | js_data.js:357 Levels["FLAG"] = { ... } |
利用过程
1. 定位 flag 字段
在 data.js 文件末尾,Levels["FLAG"] 关卡定义的最后,藏有一个 base64 字段:
1 | "ZmxhZw==": "Vk5DVEYlN0JXZWxjb21lX3RvX1ZOQ1RGMjAyMiU3RA==" |
ZmxhZw==是 base64 编码的flag(字段名提示这是 flag)- 对应的值是双层编码的 flag 数据
2. 双层解码
1 | import base64, urllib.parse |
先 base64 解码,再 URL 解码(%7B = {、%7D = }),即可还原完整 flag(见「Flag」段,真实值已脱敏)。
完整 EXP
1 | curl "http://target:8080/js/data.js" | grep -A2 "ZmxhZw==" |
1 | import base64, urllib.parse, urllib.request |
Flag
flag{xxxx}(真实值已脱敏)。最终值由 data.js 中 Levels["FLAG"] 末尾的 base64 字段经 base64 + URL 双层解码得到。
踩坑与总结
- 题目表面是游戏,实则是前端源码审计:flag 不需要真的「踩冰块」通关,而是藏在 JS 数据文件里。
- flag 藏在
Levels["FLAG"]关卡定义的末尾,以 base64 字段名ZmxhZw==(=flag)为提示。 - 双层编码:先 base64 解码,再 URL 解码(
%7B={,%7D=})——只做一层会看到一串带百分号的乱码,容易误判。 - 后端 PHP 端点(login/ 目录)在这套环境里未部署,返回 404,说明 flag 不依赖后端,纯前端可解。
- 别被标题和描述带偏:「GameV4.0」「你会踩冰块吗」都是叙事包装,先通读静态资源再决定是否玩游戏。
- 前端打包的 JS / JSON 数据文件属于公开可读资源,敏感常量不应写进客户端。
仅记录授权靶场环境下的研究;base64 字段与解码脚本来自本地 WP 归档,真实 flag 值已脱敏。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果








