kaid0x/CTF-Web-Exploitation-Challenges
GitHub: kaid0x/CTF-Web-Exploitation-Challenges
为 WSH'26 CTF 设计的两个包含已知漏洞的 Flask Web 应用靶场,分别演示目录枚举和访问控制失效两种常见 Web 安全问题。
Stars: 0 | Forks: 0
# WSH'26 — Web 漏洞利用挑战
两个专门为 WSH'26 的 Web 漏洞利用类别构建的、包含已知漏洞的 Flask Web 应用程序。每个挑战都旨在在一个受控的、适合初学者到中级人员的 CTF 环境中教授一种真实的攻击技术。
## 📁 挑战
### WEB-04 — 隐藏于众目睽睽之下 *(中级)*
**概念:** 目录枚举
| 细节 | 信息 |
|---|---|
| 工具 | Gobuster |
| 端口 | 8080 |
| 难度 | 中级 |
| Flag | `Flag{g0bust3r_f0und_m3}` |
#### 漏洞说明
该 Flask 应用提供了一个看起来正常的开发者门户,其中包含可见页面(`/`、`/about`、`/contact`)。但是,存在一个隐藏的内部端点(`/dev-console/internal`),该端点在整个网站上没有任何链接或引用——只能通过暴力破解目录路径来发现。
这反映了现实世界中最常见的配置错误之一:暴露的管理面板和内部端点在没有身份验证的情况下保持可访问状态,仅仅是因为开发者认为“如果没有链接,就没有人会找到它”。
#### 设计思路
该挑战的核心在于让主站点看起来完全合法——合适的页眉、导航、卡片、页脚。表面上没有任何东西暗示有隐藏的内容。仅仅浏览网站的玩家将一无所获。预期的解题路径是认识到该网站*可能*具有隐藏路径,并使用目录枚举工具。
提供给玩家的字典包含了常见的目录名称,其中包括 `dev-console`,Gobuster 会自动遍历这些名称。这教会玩家,安全依赖于隐蔽性根本不是真正的安全。
#### 预期解题路径
```
1. Visit http://34.93.167.112:8080
2. Browse the site — nothing suspicious is visible
3. Run gobuster with the provided wordlist:
gobuster dir -u http://34.93.167.112:8080 -w wordlist.txt
4. Gobuster discovers /dev-console returning HTTP 200
5. Visit http://34.93.167.112:8080/dev-console/internal
6. Flag is displayed on the page
```
#### 本地运行
```
docker build -t gobuster-challenge .
docker run -d -p 8080:8080 gobuster-challenge
```
### WEB-05 — 拦截我 *(高级)*
**概念:** 参数篡改 / 访问控制失效
| 细节 | 信息 |
|---|---|
| 工具 | Burp Suite |
| 端口 | 8081 |
| 难度 | 高级 |
| Flag | `Flag{burp_1nt3rc3pt_pr1v3sc}` |
| 凭证 | `staff / staff123` |
#### 漏洞说明
Flask 登录表单包含一个隐藏的 HTML 字段:
```
```
服务器直接从 POST 请求正文中读取此 `role` 参数,并用它来确定用户的访问级别——没有任何服务端验证。如果发送 `role=admin`,服务器将无条件授予管理员访问权限。
这是一个典型的**访问控制失效**漏洞——这是 OWASP 排名第一的 Web 安全风险。服务器盲目信任了一个客户端可以随意修改的值。
#### 设计思路
该挑战旨在营造出一种真实内部门户的感觉。玩家会获得有效的凭证(`staff / staff123`)并且可以成功登录——但他们进入的是一个“访问受限”的仪表板。目标从*进入系统*转变为*权限提升*。
隐藏的表单字段在浏览器 UI 中是不可见的,这意味着不检查请求的玩家将永远找不到它。预期的解题路径需要使用 Burp Suite 在传输过程中拦截 HTTP POST 请求,发现隐藏的 `role` 参数,并在转发到服务器之前对其进行修改。
这教会了一个基本概念:**永远不要信任客户端**。从浏览器发送的任何值都可以被修改。角色和权限决策必须始终在服务端强制执行。
#### 预期解题路径
```
1. Visit http://34.93.167.112:8081
2. Open Burp Suite → Proxy tab → Intercept On
3. Configure browser proxy to 127.0.0.1:8080
4. Log in with credentials: staff / staff123
5. Burp intercepts the POST request — inspect the body:
username=staff&password=staff123&role=user
6. Change role=user to role=admin
7. Click Forward to send the modified request
8. Admin dashboard loads with the flag
```
#### 本地运行
```
docker build -t burpsuite-challenge .
docker run -d -p 8081:8081 burpsuite-challenge
```
## 🚀 部署
在正式活动中,这两个挑战都部署在 **Google Cloud Platform** 上,使用 Docker 进行容器化,并通过所有参与者都可以访问的公共 IP 提供服务。
```
# 在 GCP VM 上
cd ~/challenges
# WEB-04
cd gobuster-challenge
docker build -t gobuster-challenge .
docker run -d -p 8080:8080 gobuster-challenge
# WEB-05
cd ../burpsuite-challenge
docker build -t burpsuite-challenge .
docker run -d -p 8081:8081 burpsuite-challenge
```
GCP 防火墙规则配置为向公众开放端口 `8080` 和 `8081`。完整的基础设施设置记录在 [CTFd-deployment-on-GCP-with-Docker](https://github.com/kaid0x/CTFd-deployment-on-GCP-with-Docker) 中。
## 🛠️ 技术栈
- **后端:** Python / Flask
- **容器化:** Docker
- **云托管:** Google Cloud Platform (GCP) — e2-standard-4
- **CTF 平台:** CTFd (自托管)
- **安全概念:** OWASP Top 10、目录枚举、访问控制失效
## 🧠 我学到了什么
设计 CTF 挑战比解决它们更难。每个挑战都需要从两方面进行思考:
- **作为攻击者:** 预期的利用路径是什么?它真实吗?
- **作为防御者:** 漏洞是否足够隐蔽,让玩家不会立刻发现,但又足够公平,让他们不会永远卡住?
- **作为设计师:** 难度是否适合目标受众?是否存在会偏离学习目标的非预期解题方案?
Burp Suite 挑战经历了多次迭代——早期版本要么使隐藏字段过于明显(在页面源码中带有注释可见),要么过于晦涩(玩家没有切入点)。最终版本取得了一个平衡:登录正常运行,但有趣的部分只有在拦截流量时才会显现出来。
## 💡 展示的技能
- 为教育目的设计包含已知漏洞的 Web 应用程序
- OWASP Top 10 漏洞(访问控制失效)的应用知识
- Flask Web 应用程序开发
- Docker 容器化和部署
- GCP 上的云基础设施管理
- CTF 挑战设计:平衡难度、公平性和学习目标
- 理解现实世界的攻击技术:目录枚举、参数篡改、HTTP 拦截
## 📋 活动详情
**WSH'26 — Westminster School 黑客松**
*构建。黑客。突破。学习。*
校内 CTF 与黑客松 — 2026
**类别:** Web 漏洞利用 · 逆向工程 · 密码学 · 隐写术 · 取证 · OSINT · 杂项
**挑战总数:** 30+
**难度范围:** 初级 → 高级
## ⚠️ 免责声明
这些应用程序是**故意设置漏洞的**,仅供教育目的使用。请勿将它们部署在生产环境或任何面向公共的网络中。
标签:Flask, OPA, Web安全, Web报告查看器, 安全, 蓝队分析, 请求拦截, 超时处理, 逆向工具, 靶场