CharlieZhang0216/unicorn-crm
GitHub: CharlieZhang0216/unicorn-crm
一个故意包含多种安全漏洞的企业级 CRM Web 应用程序,用于渗透测试和安全培训演练。
Stars: 1 | Forks: 0
# Unicorn CRM
企业客户关系管理平台 —— 一个专用于安全培训和红蓝队演练的包含故意漏洞的 Web 应用程序。
## 概述
Unicorn CRM 是一个功能齐全的企业 CRM,模拟了真实的企业级应用程序。它为安全专业人员提供了一个真实的攻击面,以便在多个模块中练习漏洞发现、利用和修复。
## 快速开始
```
# 安装依赖
npm install
# 启动应用程序(首次运行时自动执行 database auto-seeds)
npm start
# 访问 http://localhost:3000
```
### 其他命令
```
# 带 auto-reload 的开发模式
npm run dev
# 将 database 重置为初始状态
npm run reset
```
## 功能
### 核心模块
| 模块 | 描述 | 路由 |
|--------|-------------|--------|
| **Dashboard** | 包含团队统计数据和快捷操作的概览 | `/` |
| **客户管理** | CRUD、详细视图、批量操作(删除、分配) | `/customers` |
| **订单管理** | 带有审批工作流(批准/拒绝)的订单 | `/orders` |
| **工单系统** | 带有优先级、SLA 跟踪、批量状态/分配的支持工单 | `/tickets` |
| **用户资料** | 查看和管理具有基于角色的访问权限的资料 | `/profile` |
| **身份验证** | 登录、注册(受邀请码限制)、忘记密码 | `/auth` |
| **文件上传** | 头像上传、实体附件、下载/删除 | `/upload` |
| **文档浏览器** | 安全的文件列表和下载 | `/files` |
### 扩展模块
| 模块 | 描述 | 路由 |
|--------|-------------|--------|
| **GraphQL API** | 使用 RBAC 查询用户、客户、工单、订单 | `/graphql` |
| **REST API** | 带有 Bearer token + session 身份验证的 JSON API | `/api/v1` |
| **管理面板** | 用户管理、session、审计日志、数据库检查 | `/api/admin` |
| **CSV Export** | 导出客户、订单、工单(仅限管理员) | `/export` |
| **XML Import** | 通过 XML 上传批量导入客户/订单 | `/import` |
| **OAuth Provider** | 模拟的 Google OAuth 集成 | `/oauth` |
| **API Tokens** | 基于 JWT 的 token 管理(仅限管理员) | `/api-tokens` |
| **日历** | 带有月/周/日视图的事件,iCal 导出 | `/calendar` |
| **笔记** | 带有 CRUD、标记的富文本笔记 | `/notes` |
| **通知** | 应用内通知 + WebSocket 推送 | `/notifications` |
| **报告** | 销售 pipeline 分析和图表 | `/reports` |
| **Cron Jobs** | 计划的每日报告,每周的 token 清理 | `/jobs` |
| **API 文档** | 交互式的 Swagger 风格文档 | `/api-docs` |
| **调试面板** | 系统状态和诊断 | `/debug` |
| **GraphQL Playground** | 交互式 GraphQL 浏览器 | `/graphql` (管理员) |
### 安全架构
- 对所有更改状态的操作提供 CSRF 保护
- 使用 HTTP-only cookie 的基于 session 的身份验证
- 基于角色的访问控制(管理员 / 经理 / 员工)
- 使用 scrypt 哈希的 JWT API token 身份验证
- 身份验证 endpoint 上的速率限制
- GraphQL 深度(最大 5)和复杂性(最大 100)限制
- 生产模式下禁用 GraphQL introspection
- 对所有安全相关操作进行审计日志记录
- 用于攻击检测的 Honeypot 路由
- 安全的 HTTP 头(HSTS、CSP、XSS 保护)
- 密码强度强制要求(大写字母 + 小写字母 + 数字 + 特殊字符 + 黑名单)
- 带有每个用户的 salt 的 scrypt 密码哈希
## 测试账户
| 用户名 | 密码 | 角色 |
|----------|----------|------|
| `admin` | `Adm1n!Crm#2026` | 管理员 |
| `zhang.wei` | `rGDdXKq7+e$d^M5Y` | 管理员 |
| `li.na` | `sZPdAPc7X*4kSN*q` | 经理(销售 - 西海岸) |
| `wang.lei` | `vFm4Y4-Pyj5vDZnF` | 经理(工程部) |
| `chen.xiao` | `JLc!2n%ExsS@T!X%` | 经理(运营 - 中部) |
| `sarah.chen` | `g*F^-Ng@nq7LHNfR` | 员工(销售) |
| `james.wilson` | `2gN48NqzFCt8j-4s` | 员工(财务) |
| `emma.park` | `REuwwSnw+2fn&hTR` | 员工(支持) |
| `li.wei` | `_BG-T_CxQg#5HbsK` | 员工(工程部) |
| `maria.garcia` | `7+gq$*&GbSc2Fp9&` | 员工(支持) |
数据库包含 10 个用户、15 个客户、20 个订单、15 个工单和 20 条审计日志条目 —— 均为虚构数据。
## 项目结构
```
unicorn-crm/
├── app.js # Express entry point
├── package.json
├── config/
│ ├── database.js # SQLite initialization
│ └── seed.js # Fake data seeding (10 users, 15+ entities)
├── middleware/
│ ├── auth.js # Session authentication
│ ├── csrf.js # CSRF token protection
│ ├── api-auth.js # Bearer token + JWT auth
│ ├── graphql-auth.js # GraphQL auth context injection
│ ├── audit.js # Attack audit + honeypot routes
│ ├── headers.js # Security HTTP headers
│ └── banner.js # Security warning banner
├── routes/
│ ├── index.js # Dashboard & API docs
│ ├── auth.js # Login / Register / Forgot password
│ ├── customers.js # Customer CRUD
│ ├── customers-batch.js # Batch delete / assign
│ ├── orders.js # Order management + approval workflow
│ ├── tickets.js # Ticket CRUD + comments
│ ├── tickets-batch.js # Batch status / assign
│ ├── profile.js # User profiles
│ ├── files.js # Document browser
│ ├── upload.js # Avatar + attachment upload
│ ├── export.js # CSV export (admin only)
│ ├── import.js # XML batch import
│ ├── api.js # REST API
│ ├── admin.js # Admin panel (users, sessions, audit, DB)
│ ├── api-tokens.js # JWT token management
│ ├── oauth.js # Mock OAuth provider
│ ├── graphql.js # GraphQL endpoint
│ ├── calendar.js # Calendar events + iCal export
│ ├── notes.js # Rich text notes
│ ├── notifications.js # In-app notifications
│ ├── reports.js # Sales reports
│ ├── jobs.js # Cron job management
│ ├── debug.js # System diagnostics
│ └── errors.js # Search + error handling
├── services/
│ ├── mail.js # Email service (mock)
│ ├── scheduler.js # Cron job scheduler
│ └── websocket.js # Real-time notification push
├── views/ # EJS templates (23 views)
├── public/ # Static assets
└── data/ # SQLite database (auto-created)
```
## 技术栈
- **Runtime**: Node.js
- **框架**: Express 4
- **模板**: EJS
- **数据库**: SQLite(通过 better-sqlite3)
- **API**: REST + GraphQL(express-graphql)
- **身份验证**: Session cookie + JWT Bearer token + OAuth 2.0 模拟
- **实时**: WebSocket (ws)
- **调度**: node-cron
- **文件上传**: Multer
- **样式**: Bootstrap 5 (CDN)
## 攻击面(预期)
此应用程序在设计上包含了用于培训的故意漏洞:
- **信息泄露**: 调试 endpoint、错误堆栈跟踪、API 文档、GraphQL introspection
- **身份验证绕过**: 弱默认凭证、邀请码限制、速率限制测试
- **授权缺陷**: 资料上的 IDOR、通过 mass assignment 导致的权限提升
- **注入**: 搜索中的 SQL 注入、笔记中的 XSS、XML 导入中的 XXE
- **业务逻辑**: 订单批准绕过、批量操作滥用、CSV 导出泄露
- **API 滥用**: Token 枚举、JWT none-algorithm、WebSocket 身份验证绕过
所有故意漏洞都已记录在案,供教育性质的总结复盘使用。
## 许可证
MIT —— 仅用于教育和授权的安全培训。请参阅 [LICENSE](LICENSE)。
标签:CISA项目, GNU通用公共许可证, GraphQL, HTTP工具, MITM代理, Node.js, RESTful API, 企业CRM系统, 安全培训靶场, 提示词优化, 故意漏洞应用, 网络测绘, 自定义脚本