sunnypatell/securebank-ctf

GitHub: sunnypatell/securebank-ctf

一个基于 Next.js 构建的含故意漏洞的银行模拟应用,用于 SQL 注入和访问控制等 Web 安全 CTF 实战训练。

Stars: 1 | Forks: 2

🏦 SecureBank CTF

专为 Web 安全实战训练设计的含有故意漏洞的银行应用。

Repo License Next React TypeScript Node Docker PRs

## 目录 - 概述 - 快速开始 - Docker 使用 - 自托管(已发布镜像) - 项目结构 - 功能特性 - 技术栈 - 架构 - API 端点 - 数据库结构 - 页面与组件 - CTF 挑战 - 开发工作流 - 安全策略 - 贡献指南 - 许可证 ## 概述 SecureBank 是一个全栈银行模拟系统,用于 Web 安全教学。它模拟了逼真的用户界面,包含登录/注册、交易、反馈和 FAQ 中心等功能——并故意留下了存在 SQLi 和访问控制漏洞的路径以供练习。 ## 快速开始 - 前置条件:Node.js 18+,npm 8+ Windows PowerShell: ``` cd frontend npm ci npm run dev # 打开 http://localhost:3000 ``` macOS/Linux/WSL: ``` cd frontend npm ci npm run dev # 打开 http://localhost:3000 ``` 默认演示凭据(或自行注册): - 用户名:`admin` | 密码:`admin123` - 用户名:`sunny.admin` | 密码:`sunny.admin123` 环境配置: - 创建 `frontend/.env.local` 并设置 `COOKIE_SECRET=...`(一个强随机字符串)。注意:为了方便,仓库中包含了一个默认 secret;如果需要,请在演示时替换它。 ## Docker 使用 在仓库根目录执行: ``` docker build -t securebank-ctf . ``` 将进度持久化到宿主机目录或命名卷: Linux/macOS/WSL/Kali ``` docker run --rm -p 3000:3000 \ -v "$(pwd)/securebank-data:/app/data" \ --name securebank securebank-ctf ``` Windows PowerShell ``` docker run --rm -p 3000:3000 ` -v ${PWD}/securebank-data:/app/data ` --name securebank securebank-ctf ``` Docker 命名卷 ``` docker volume create securebank-data docker run --rm -p 3000:3000 \ -v securebank-data:/app/data \ --name securebank securebank-ctf ``` 注意事项: - 首次启动会从干净的快照中初始化 `/app/data/database.sqlite`;后续重启将复用同一个数据库。 - 如果仅作临时演示,可省略挂载卷(进度会在容器移除后重置)。 - 覆盖 cookie secret:`-e COOKIE_SECRET=your-secret`。 - 修改端口:`-e PORT=4000 -p 4000:4000`。 ## 自托管(已发布镜像) 带有标签的发布会将一个可验证的容器镜像发布到 GitHub Container Registry,专为 `linux/amd64` 架构构建。 ``` docker pull ghcr.io/sunnypatell/securebank-ctf:1.0.0 docker run --rm -p 3000:3000 -v securebank-data:/app/data \ ghcr.io/sunnypatell/securebank-ctf:1.0.0 # http://localhost:3000 (demo 凭据:admin / admin123) ``` 或者使用 Docker Compose(仓库根目录中已包含 `docker-compose.yml`): ``` docker compose up ``` Apple Silicon:该镜像为 amd64 架构,在 arm64 宿主机上通过 Docker 的运行时模拟运行;原生多架构镜像已在计划中。 ### 验证发布(供应链) 每个发布的镜像都使用 Sigstore 进行了签名,并包含 SLSA 构建来源以及 SBOM 证明,且均绑定到镜像摘要。请在运行前进行验证: ``` gh attestation verify \ oci://ghcr.io/sunnypatell/securebank-ctf:1.0.0 \ --repo sunnypatell/securebank-ctf ``` ## 项目结构 ``` securebank-ctf/ ├─ challenges/ │ ├─ access_control_view_transactions/ │ ├─ admin_login_medium/ │ ├─ immediate_authority_medium/ │ ├─ privilege_escalation_medium/ │ └─ user_credentials_medium/ ├─ frontend/ │ ├─ app/ │ │ ├─ api/{feedback,get-session,login,logout,register,transactions} │ │ ├─ dashboard/{feedback,transactions,new} │ │ ├─ help-faq/ • login/ • register/ • public/discussions/ │ │ └─ layout.tsx • page.tsx • globals.css │ ├─ database/db.ts │ ├─ lib/{utils.ts,next-connect.d.ts} │ ├─ public/* │ └─ package.json • tailwind.config.ts • tsconfig.json ├─ Dockerfile • start.sh ├─ README.md • CONTRIBUTING.md • CODE_OF_CONDUCT.md • SECURITY.md • Outline.md └─ LICENSE ``` ## 功能特性 - 账户管理:登录/登出、注册、会话追踪 - 交易:历史记录、搜索/过滤、新增条目 - 反馈:提交、列表展示及管理员删除 - 帮助与 FAQ:分类内容;故意留下的存在漏洞的搜索 - 安全模型:签名 session cookie,用于 CTF 的故意 SQLi/逻辑漏洞 ## 技术栈 - 前端:Next.js 15 (App Router)、React 19、TypeScript、Tailwind CSS - 后端:Next.js API routes、`better-sqlite3`、`cookie-signature` - 数据:SQLite(无 ORM),仓库内置用于工作坊的种子数据库 - 工具:ESLint、Prettier、Docker ## 架构 - App Router 页面位于 `frontend/app/*`,路由处理程序同址放在 `app/api/*` - 通过 `frontend/database/db.ts` 中配置的 `better-sqlite3` 使用 SQLite - 身份验证通过包含 `{ username, role }` 的签名 cookie 实现 ### 系统图表 ``` %%{init: { "theme": "base", "themeVariables": { "primaryColor": "#3B82F6", "primaryBorderColor": "#2563EB", "primaryTextColor": "#ffffff", "clusterBkg": "#F8FAFC", "clusterBorder": "#94A3B8", "lineColor": "#64748B" } }}%% flowchart TB Title["SecureBank CTF — Architecture
Diagram by Sunny Patel"] subgraph App["SecureBank CTF — Next.js 15 + SQLite"] direction TB Client["Client Pages
/ • /login • /register
/dashboard • /dashboard/transactions (+new)
/dashboard/feedback • /help-faq"] Server["App Router + UI
Route Handlers (app/api/*)
cookies/headers"] API["API Routes
POST login • POST logout • POST register
GET get-session • GET/POST/DELETE feedback • GET/POST transactions"] DBInit["database/db.ts
schema init + admin seeding"] SQLite[("SQLite
database.sqlite")] Client --> Server --> API --> SQLite DBInit -. init/seed .- SQLite subgraph Container["Containerization"] Dockerfile["Dockerfile
multi-stage build"] Start["start.sh
seed, symlink, run"] Volume["Volume /app/data
(persist)"] end Dockerfile --> Start --> SQLite Volume --- SQLite Start -. symlink/persist .- SQLite end classDef vuln fill:#fff3cd,stroke:#f0ad4e,color:#8a6d3b; classDef title fill:#F8FAFC,stroke:#2563EB,color:#0F172A; V1["Vulnerable surfaces
feedback search • transactions search"]:::vuln API --- V1 Title ``` ### 数据模型与流程 ``` %%{init: { "theme": "base", "themeVariables": { "primaryColor": "#3B82F6", "primaryBorderColor": "#2563EB", "primaryTextColor": "#ffffff", "clusterBkg": "#F8FAFC", "clusterBorder": "#94A3B8", "lineColor": "#64748B" } }}%% erDiagram USERS { int id PK string username string password string role } TRANSACTIONS { int id PK int user_id FK datetime date string description int amount string type } FEEDBACK { int id PK string user string message datetime date boolean read } USERS ||--o{ TRANSACTIONS : makes USERS ||--o{ FEEDBACK : "submits (by username)" ``` 图表由 Sunny Patel 制作 ``` %%{init: { "theme": "base", "themeVariables": { "primaryColor": "#3B82F6", "primaryBorderColor": "#2563EB", "primaryTextColor": "#ffffff", "clusterBkg": "#F8FAFC", "clusterBorder": "#94A3B8", "lineColor": "#64748B" } }}%% sequenceDiagram title SecureBank — Login Sequence autonumber participant U as User (Browser) participant A as Next.js API (/api/login) participant C as Cookie-Signature participant DB as SQLite (database.sqlite) U->>A: POST /api/login (username, password) A->>A: Double-decode inputs A->>DB: SELECT * FROM Users WHERE username AND password alt Credentials match A->>C: Sign session JSON with COOKIE_SECRET C-->>A: Signed value A-->>U: 200 OK + Set-Cookie session, userId else Invalid A-->>U: 401 Unauthorized end Note over U,A: Subsequent requests attach signed session cookie U->>A: GET /api/get-session A->>C: Unsign session with COOKIE_SECRET C-->>A: Plain session JSON A-->>U: 200 { username, role } Note over U,DB: Diagram by Sunny Patel ``` ## API 端点 - `POST /api/login` • `POST /api/logout` • `POST /api/register` - `GET /api/get-session` • `GET/POST /api/feedback` • `GET/POST /api/transactions` 创建 cookie 示例(来自登录路由): ``` const sessionData = JSON.stringify({ username: decodedUsername, role: user.role }); const signedSession = cookieSignature.sign(sessionData, process.env.COOKIE_SECRET!); (await cookies()).set("session", signedSession, { httpOnly: true, secure: process.env.NODE_ENV === "production", sameSite: "strict", maxAge: 60 * 60 * 24, path: "/", }); ``` ## 数据库结构 数据表 ``` CREATE TABLE IF NOT EXISTS Users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(1000) UNIQUE, password VARCHAR(1000), role VARCHAR(1000) ); CREATE TABLE IF NOT EXISTS Transactions ( id INTEGER PRIMARY KEY AUTOINCREMENT, sender VARCHAR(1000), recipient VARCHAR(1000), amount INTEGER ); CREATE TABLE IF NOT EXISTS feedback ( id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT NOT NULL, message TEXT NOT NULL, date TEXT DEFAULT CURRENT_TIMESTAMP, read BOOLEAN DEFAULT 0 ); ``` 如果缺失则初始化管理员(节选): ``` const adminExists = db.prepare("SELECT * FROM Users WHERE username = 'admin'").get(); if (!adminExists) db.prepare("INSERT INTO Users (username, password, role) VALUES (?, ?, ?)").run("admin","admin123","admin"); ``` ## 页面与组件 - 首页 `/` • 登录 `/login` • 注册 `/register` - 仪表板 `/dashboard`,包含交易 `/dashboard/transactions` 和新增 `/dashboard/transactions/new` - 反馈 `/dashboard/feedback` - 帮助与 FAQ `/help-faq`(故意留下的存在漏洞的搜索) 核心组件:导航栏、交易卡片、FAQ 折叠面板、搜索和表单组件。 ## CTF 挑战 - 访问控制 – 查看所有交易(中等):触发隐藏的开发者逻辑并绕过基于用户的过滤器,以列出所有交易。详见 `challenges/access_control_view_transactions`。 - 通过双重编码注入以管理员身份登录(中等):使用 URL 双重编码的 payload 绕过过滤器,以 admin 身份登录。详见 `challenges/admin_login_medium`。 - 即时权限(中等):通过注册密码进行注入,创建具有 admin 角色的账户。详见 `challenges/immediate_authority_medium`。 - 通过反馈注入进行权限提升(中等):通过反馈进行多语句查询堆叠以提升自身角色,然后重新登录。详见 `challenges/privilege_escalation_medium`。 - 反馈表单中的 SQLi – 导出凭据(中等):通过在反馈表单中注入,提取 `Users` 表中的凭据。详见 `challenges/user_credentials_medium`。 ## 开发工作流 - 代码组织:`app`(页面)、`app/api`(端点)、`components`、`database`、`lib`、`globals.css` - 添加功能:创建组件/页面,添加 API 处理程序,更新数据库(如有必要),本地测试,使用具有描述性的信息进行提交 - 最佳实践:强类型代码,单一职责的小型组件,响应式 UI,语义化 HTML,仅在 CTF 需要处故意保留未经消毒的输入区域 ## 安全策略 本仓库出于学习目的故意包含了不安全的代码模式。对于非预期的问题,请参阅 `SECURITY.md` 进行负责任的披露。请勿公开披露与预设挑战无关的漏洞利用详情。有关授权使用条款,请参阅 `DISCLAIMER.md`;有关发布历史,请参阅 `CHANGELOG.md`。 ## 许可证 MIT — 详见 `LICENSE`。
完整的原始 README(保留) — 点击展开 # SecureBank 应用程序 ## 概述 SecureBank 是一个综合性的银行应用程序模拟,专为教育目的设计,特别侧重于 Web 安全和 SQL 注入漏洞。该应用程序提供了一个逼真的银行界面,具备账户管理、交易追踪、反馈系统以及详细的帮助与 FAQ 部分等功能。 ## 目录 - [功能特性](#features) - [设置与安装](#setup-and-installation) - [本地运行](#running-locally) - [项目结构](#project-structure) - [API 与后端](#api-and-backend) - [数据库结构](#database-structure) - [安全漏洞](#security-vulnerabilities) - [页面与组件](#pages-and-components) - [使用的技术](#technologies-used) - [开发工作流](#development-workflow) - [部署](#deployment) - [贡献指南](#contributing) - [许可证](#license) ## 功能特性 SecureBank 提供了一整套旨在模拟真实银行应用程序的功能: ### 账户管理 - 用户身份验证(登录/登出) - 账户注册 - 资料管理 - 会话追踪(上次登录时间) ### 交易系统 - 查看交易历史 - 新增交易(贷记/借记) - 搜索和筛选交易 - 交易分类 ### 反馈系统 - 提交关于应用程序的反馈 - 查看其他用户的反馈 - 反馈历史追踪 ### 帮助与 FAQ 中心 - 按类别组织的全面 FAQ 部分 - 可搜索的 FAQ 数据库 - 提示与安全建议 - 其他帮助资源 ### 安全功能(及故意留下的漏洞) - 密码保护 - 基于签名 cookie 的会话管理 - 安全路由 - 出于教育目的故意留下的 SQL 注入漏洞 ## 设置与安装 ### 前置条件 - Node.js(v18.0.0 或更高版本) - npm(v8.0.0 或更高版本) ### 安装步骤 1. **导航到项目目录(从根目录开始)**: ``` cd frontend ``` 2. **安装依赖**: ``` npm ci ``` 注意:我们使用 `npm ci` 而不是 `npm install`,以确保安装 package-lock.json 中的精确版本。 3. **设置环境变量(已在仓库中提交)**: 在根目录下创建一个 `.env.local` 文件,包含以下变量: Cookie 签名所需 `COOKIE_SECRET=p9Y!2m@lK8z$1WqA7&dE4Xu0Cj` ## 本地运行 在本地运行应用程序: 1. **导航到项目目录(从根目录开始)**: ``` cd frontend ``` 2. **启动开发服务器**: ``` npm run dev ``` 3. **访问应用程序**: 打开浏览器并导航到 `http://localhost:3000` 4. **登录凭据**: 出于测试目的,您可以使用以下凭据: - 用户名:`admin` - 密码:`admin123` 或 - 用户名:`sunny.admin` - 密码:`sunny.admin123` 或者通过注册页面注册一个新账户。 ## 使用 Docker 运行 为了为研讨会或 CTF 活动提供一致的环境,您可以在容器中运行 SecureBank。该镜像内置了一份纯净的 SQLite 数据库副本,同时仍允许每个容器实例在重启后保留各自的进度。 1. **构建镜像**(从仓库根目录开始): docker build -t securebank-ctf . 2. **启动容器**,使用与您的平台相匹配的卷语法。以下所有示例都将进度持久化在名为 `securebank-data` 的文件夹或卷中: - **Linux / macOS / WSL / Kali** docker run --rm -p 3000:3000 \ -v "$(pwd)/securebank-data:/app/data" \ --name securebank securebank-ctf - **Windows PowerShell** docker run --rm -p 3000:3000 ` -v ${PWD}/securebank-data:/app/data ` --name securebank securebank-ctf - **Docker 命名卷(通用)** docker volume create securebank-data docker run --rm -p 3000:3000 \ -v securebank-data:/app/data \ --name securebank securebank-ctf 容器首次启动时,会从一个干净的快照初始化 `/app/data/database.sqlite`。后续重启将复用同一个数据库文件,因此已解决的挑战和创建的用户将保持原样,直到您删除挂载的目录或卷。 3. **访问应用程序**,在浏览器中打开 `http://localhost:3000`,使用上述凭据或创建您自己的账户。 ## 项目结构 ``` frontend/ ├── app/ # Next.js App Router directory │ ├── api/ # API routes for backend functionality │ │ ├── feedback/ # Feedback API endpoints │ │ │ └── route.ts │ │ ├── get-session/ # Session management endpoints │ │ │ └── route.ts │ │ ├── login/ # Authentication endpoints │ │ │ └── route.ts │ │ ├── logout/ # Logout functionality │ │ │ └── route.ts │ │ ├── register/ # User registration │ │ │ └── route.ts │ │ └── transactions/ # Transaction management │ │ └── route.ts │ ├── dashboard/ # Dashboard pages │ │ ├── feedback/ # Feedback system │ │ │ └── page.tsx │ │ ├── transactions/ # Transaction management │ │ │ ├── add/ │ │ │ │ └── page.tsx # Add transaction form │ │ │ └── page.tsx # Transaction list │ │ └── page.tsx # Main dashboard │ ├── help-faq/ # Help & FAQ section │ │ └── page.tsx │ ├── login/ # Login page │ │ └── page.tsx │ ├── public/ # Public discussions page │ │ └── discussions/ │ │ └── page.tsx │ ├── register/ # Registration page │ │ └── page.tsx │ ├── globals.css # Global CSS styles │ ├── layout.tsx # Root layout │ └── page.tsx # Landing page ├── components/ # Shared components (not shown in file structure) │ ├── ui/ # UI components │ └── ... ├── database/ # Database configuration and setup │ └── db.ts # SQLite database initialization ├── lib/ # Utility functions and libraries │ └── utils.ts ├── public/ # Static assets │ ├── digital-flow.png │ ├── interconnected-banking.png │ └── secure-future-hands.png ├── .env.local # Environment variables ├── .eslintrc.json # ESLint configuration ├── .gitignore # Git ignore file ├── database.sqlite # SQLite database file ├── next.config.mjs # Next.js configuration ├── package.json # Project dependencies ├── README.md # Project documentation ├── tailwind.config.ts # Tailwind CSS configuration └── tsconfig.json # TypeScript configuration └── Dockerfile # Build structset └── .dockerignore # Docker ignore file (node_modules, etc.) └── start.sh # Start script for Docker ``` ## API 与后端 该应用程序使用 Next.js App Router API 路由来处理后端功能。每个 API端点都作为路由处理程序实现在 `app/api` 目录中。 ### API 结构 - **`/api/feedback`**:管理用户反馈的提交和获取 - **`/api/get-session`**:处理会话管理和用户信息检索 - **`/api/login`**:验证用户身份并创建安全会话 - **`/api/logout`**:终止用户会话 - **`/api/register`**:处理新用户注册 - **`/api/transactions`**:管理交易的创建和检索 ### 身份验证流程 该应用程序使用签名 cookie 进行安全身份验证: 1. 用户提交登录凭据 2. 服务器针对数据库验证凭据 3. 身份验证成功后,使用 cookie-signature 创建签名的会话 cookie 4. 会话信息包含用户名和角色 5. 受保护的路由在授予访问权限之前会验证会话 cookie 登录路由处理程序中的示例: ``` // Create signed session cookie const sessionData = JSON.stringify({ username: decodedUsername, role: user.role }); const secret = process.env.COOKIE_SECRET!; const signedSession = cookieSignature.sign(sessionData, secret); // Set the cookie (await cookies()).set("session", signedSession, { httpOnly: true, secure: process.env.NODE_ENV === "production", sameSite: "strict", maxAge: 60 * 60 * 24, // 1-day expiration path: "/", }); ``` ## 数据库结构 应用程序使用 SQLite 结合 better-sqlite3 进行数据存储。数据库结构定义在 `database/db.ts` 中: ### 数据表 1. **Users** ``` CREATE TABLE IF NOT EXISTS Users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(1000) UNIQUE, password VARCHAR(1000), role VARCHAR(1000) ); ``` 2. **Transactions** ``` CREATE TABLE IF NOT EXISTS Transactions ( id INTEGER PRIMARY KEY AUTOINCREMENT, sender VARCHAR(1000), recipient VARCHAR(1000), amount INTEGER ); ``` 3. **Feedback** ``` CREATE TABLE IF NOT EXISTS feedback ( id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT NOT NULL, message TEXT NOT NULL, date TEXT DEFAULT CURRENT_TIMESTAMP, read BOOLEAN DEFAULT 0 ); ``` ### 数据库初始化 如果不存在默认管理员用户,数据库将使用该用户进行初始化: ``` // Inserts a hardcoded admin user if none exists const adminExists = db.prepare("SELECT * FROM Users WHERE username = 'admin'").get(); if (!adminExists) { db.prepare("INSERT INTO Users (username, password, role) VALUES (?, ?, ?)").run( "admin", "admin123", "admin" ); console.log("Admin user created: admin / admin123"); } else { console.log("Admin user already exists."); } ``` ### 主要页面 1. **首页** (`/`): - SecureBank 介绍 - 登录和注册链接 - 使用 Vanta.js 的动画背景 2. **登录页面** (`/login`): - 用户身份验证表单 - 无效凭据的错误处理 - 注册页面的链接 3. **注册页面** (`/register`): - 新用户注册表单 - 密码确认 - 表单验证 4. **仪表板** (`/dashboard`): - 账户概览 - 最近交易 - 财务统计 - 到其他部分的快速链接 5. **交易** (`/dashboard/transactions`): - 交易历史表格 - 搜索和过滤功能 - 交易汇总卡片 6. **新增交易** (`/dashboard/transactions/new`): - 用于添加新交易的表单 - 日期选择器 - 交易类型选择 7. **反馈** (`/dashboard/feedback`): - 反馈提交表单 - 反馈历史 - 反馈统计数据 8. **帮助与 FAQ** (`/help-faq`): - 分类的 FAQ 区域 - 搜索功能(存在 SQL 注入漏洞) - 联系信息 ### 关键组件 1. **导航栏**: - 存在于所有经过身份验证的页面上 - 指向主要部分的链接 - 登出按钮 2. **交易卡片**: - 显示交易信息 - 根据交易类型进行颜色编码 3. **FAQ 折叠面板**: - 可展开的 FAQ 项目 - 分类过滤 4. **搜索组件**: - 存在于交易和 FAQ 页面中 - (故意)容易受到 SQL 注入攻击 5. **表单组件**: - 登录、注册、交易和反馈表单 - 输入验证 ## 使用的技术 ### 前端 - **Next.js**:用于服务端渲染应用程序的 React 框架 - **React**:用于构建用户界面的 JavaScript 库 - **TypeScript**:JavaScript 的类型化超集 - **Tailwind CSS**:实用优先的 CSS 框架 - **Vanta.js**:登录屏幕上的 3D 动画背景。 ### 后端 - **Next.js API 路由**:服务端 API 端点 - **better-sqlite3**:用于 Node.js 的 SQLite 数据库驱动 - **cookie-signature**:用于签名和验证 cookie - **next/headers**:用于路由处理程序中的 cookie 管理 ### 开发工具 - **ESLint**:JavaScript linting 实用程序 - **Prettier**:代码格式化工具 - **Git**:版本控制系统 ## 开发工作流 ### 代码组织 - **页面**:遵循 Next.js App Router 约定,位于 `app` 目录中 - **API 路由**:位于 `app/api` 目录中的服务端端点 - **组件**:位于 `components` 目录中的可复用 UI 元素 - **数据库**:位于 `database` 目录中的 SQLite 设置和 schema - **样式**:Tailwind CSS 实用类和 `globals.css` 中的全局样式 - **工具**:位于 `lib` 目录中的辅助函数 ### 添加新功能 1. 在 `components` 目录中创建新组件 2. 在 `app` 下的相应目录中添加新页面 3. 在 `app/api` 目录中实现 API 端点 4. 如有必要,在 `database/db.ts` 更新数据库 schema 5. 在本地测试该功能 6. 使用具有描述性的提交信息提交更改 ### 最佳实践 - 遵循 TypeScript 类型定义 - 使用 React hooks 进行状态管理 - 使用 Tailwind 的响应式工具实现响应式设计 - 保持组件小巧并专注于单一职责 - 使用语义化 HTML 元素 - 在生产代码中正确清理用户输入(出于 CTF 目的,在某些地方故意未执行此操作) ## 许可证 该项目基于 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件。 ## 免责声明 本应用程序出于教育目的包含故意的安全漏洞。在未解决这些漏洞的情况下,请勿在生产环境中使用此代码。本应用程序的创建者对因代码引起的任何误用或损坏概不负责。 *最后更新:2025 年 4 月 15 日* *仅为 Ontario Tech 的 CSCI3540U - CTF 期末主要项目提供教育目的。*
标签:CISA项目, Docker, MITM代理, OPA, TypeScript, Web安全, 安全插件, 安全防御评估, 数据泄露, 自动化攻击, 蓝队分析, 请求拦截, 靶场