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, 事件倒计时, 可自定义解析器, 后台管理, 安全插件, 排行榜, 文件上传下载, 活动管理系统, 竞赛平台, 自动化攻击, 规则展示, 评分系统, 调试竞赛, 软件开发竞赛, 队伍管理, 高校技术活动, 黑客马拉松