JyotismoyKalita/bug-bounty-platform
GitHub: JyotismoyKalita/bug-bounty-platform
一个为高校网络安全竞赛设计的 Bug Bounty 赛事管理平台,支持漏洞识别与修复的多团队在线竞赛活动。
Stars: 2 | Forks: 0
# Bug Bounty 平台
Bug Bounty 平台是一款专为调试竞赛定制的赛事应用,专为 Gauhati 大学信息技术系举办的科技活动 `Hackdays 4.0` 的 `BugBounty4` 环节设计。团队可以登录、等待比赛窗口开启、下载有 Bug 的项目 ZIP 包、提交解决方案,并在共享仪表板上跟踪成绩。管理员可以配置赛事、管理题库、审查提交的作品、发布排行榜,并为内置的 Frint 赛道维护单独的分数。
## 应用功能
- 团队使用邮箱和密码通过 Supabase Auth 登录并创建账号
- 具有倒计时、规则和权限控制题目访问的赛事感知仪表板
- 包含评分、运行说明、提示和预览文件的题目详情页
- 每道题目的 ZIP 下载和每次提交的 ZIP 上传
- 支持 `identify_only`、`fix_only` 和 `identify_and_fix` 提交意图
- 用于赛事设置、团队管理、题目管理和审查的管理员控制中心
- 排行榜发布流程,使团队仅在管理员准备好时才能看到最终结果
- 独立的 Frint 赛道流程,包含手动输入的分数,并计入最终排名
## 技术栈
- Next.js 15
- React 19
- TypeScript
- Tailwind CSS
- Supabase Auth、Postgres 和 Storage
## 主要路由
- `/` - 参赛者仪表板
- `/login` - 登录和团队账号创建
- `/leaderboard` - 最终排行榜,包含 Frint 赛道排名
- `/problems/[id]` - 单个题目页面
- `/problems/frint-track` - 外部 Frint 赛道说明和链接
- `/admin/submissions` - 管理员控制中心
## 仓库结构
```
app/
admin/submissions/ # admin control center page
api/
admin/ # admin APIs for events, problems, teams, reviews, downloads
auth/ # auth-related APIs
config/ # active event settings
problems/ # problem downloads
submissions/ # submission upload/download flow
leaderboard/ # leaderboard page
login/ # login page
problems/[id]/ # problem detail page
problems/frint-track/ # external Frint track page
components/ # dashboard, admin, leaderboard, and form UI
lib/ # auth, event logic, Supabase clients, data access, utilities
scripts/ # helper scripts
supabase/ # schema and migrations
public/ # static assets and guide images
```
## 本地设置
### 1. 安装依赖
```
npm install
```
### 2. 配置环境变量
在项目根目录创建 `.env.local` 文件,内容如下:
```
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
NEXT_PUBLIC_SITE_URL=http://localhost:3000
```
注意事项:
- 应用需要 `NEXT_PUBLIC_SUPABASE_URL` 和 `NEXT_PUBLIC_SUPABASE_ANON_KEY`。
- 管理员端操作(如团队创建、题目管理、审查和下载)需要 `SUPABASE_SERVICE_ROLE_KEY`。
- `NEXT_PUBLIC_SITE_URL` 用于基于回调的授权流程,在本地开发中可安全地保持为 `http://localhost:3000`。
- 此仓库中目前没有 `.env.example` 文件。
### 3. 设置 Supabase
创建一个 Supabase 项目,然后执行以下操作:
1. 启用 Email 认证。
2. 运行 [`supabase/schema.sql`](/D:/Programming/Hackdays/bug-bounty-platform/supabase/schema.sql)。
3. 如果您是在现有数据库上升级而不是全新开始,还需要运行 `supabase/` 中适用于您当前状态的迁移文件。
4. 确保存储桶 `problem-zips` 和 `submission-zips` 存在。
5. 在 `event_settings` 中添加至少一行活动记录。
6. 在该用户拥有 `profiles` 行之后,创建或提升一个管理员账号。
全新项目通常只需要 `schema.sql`,因为它已经包含了当前的表、策略、存储桶和排行榜视图。
### 4. 启动应用
```
npm run dev
```
打开 [http://localhost:3000](http://localhost:3000)。
## 数据模型摘要
主要的表和视图如下:
- `profiles` - 团队和管理员
- `event_settings` - 赛事时间、激活状态、重新提交策略和排行榜发布状态
- `problems` - 题目元数据、存储路径、评分、提示、预览文件和运行说明
- `submissions` - 每个团队针对每个题目的一项提交
- `track_scores` - 外部赛道(如 Frint)的每个团队手动评分
- `leaderboard` - 跨题目分数和赛道分数的计算排名视图
## 赛事行为
- 团队可以在赛事开始前登录。
- 题目和下载仅在赛事进行期间解锁。
- 仅在赛事进行期间接受提交。
- 团队在赛事结束前无法查看排行榜。
- 赛事结束后,团队仍需等待,直到管理员明确发布排行榜。
- 管理员可以针对每场赛事启用或禁用重新提交。
## 评分模型
管理员 UI 目前使用固定的难度方案:
- `easy` -> `100 分`
- `medium` -> `200 分`
- `hard` -> `300 分`
应用还会将手动输入的 Frint 赛道分数存储在 `track_scores` 中,这些分数将计入最终排行榜总分。
## 管理员工作流
在 `/admin/submissions`,管理员可以:
- 创建、编辑和删除题目
- 上传或替换题目 ZIP 包
- 添加提示、预览文件、预期行为和运行说明
- 安排或重置当前赛事
- 启用重新提交
- 发布排行榜
- 审查每个团队针对每道题目的最新提交
- 设定评判结果和分数
- 输入 Frint 赛道分数
- 移除团队
- 下载单个上传文件或批量下载提交内容
## 参赛者工作流
1. 创建团队账号或登录。
2. 等待赛事开始。
3. 打开题目页面并下载其 ZIP 包。
4. 在本地解决问题。
5. 上传该题目的一个 ZIP 提交包。
6. 选择正确的提交意图。
7. 赛事结束且排行榜发布后,查看最终结果。
## 重要提示
- 上传的团队代码从不在服务器上执行。
- 提交的上传内容存储在 Supabase Storage 中。
- 当前的登录流程基于邮箱/密码。
- 仓库中仍存在一些与回调和 OTP 相关的文件,但它们不是 UI 中显示的主要参赛者登录路径。
## 管理员引导
首先创建一个普通账号,然后在 Supabase 中将其提升为管理员:
```
update public.profiles
set role = 'admin'
where email = 'admin@example.com';
```
## 常用命令
```
npm run dev
npm run build
npm run start
npm run lint
```
## 许可证
MIT
标签:Bug Bounty, Bug修复, CTF平台, Postgres, React, Supabase, Syscalls, Tailwind CSS, TypeScript, 事件倒计时, 可自定义解析器, 后台管理, 安全插件, 排行榜, 文件上传下载, 活动管理系统, 竞赛平台, 自动化攻击, 规则展示, 评分系统, 调试竞赛, 软件开发竞赛, 队伍管理, 高校技术活动, 黑客马拉松