Djones-qa/api-security-testing-suite
GitHub: Djones-qa/api-security-testing-suite
该项目将 OWASP ZAP 的 DAST 自动化扫描与自定义 Jest 安全测试相结合,通过 CI 安全门禁拦截高危漏洞,为 REST API 提供了覆盖 OWASP Top 10 的自动化安全测试方案。
Stars: 0 | Forks: 0
# 🔐 API 安全测试套件
[](https://github.com/Djones-qa/api-security-testing-suite/actions)
[](https://www.zaproxy.org/)
[](https://snyk.io/)
[](https://www.typescriptlang.org/)
[](https://jestjs.io/)
[](https://www.docker.com/)
[](https://nodejs.org/)
[](./LICENSE)
[](https://owasp.org/www-project-top-ten/)
## 概述
这是一个生产级的**动态应用安全测试 (DAST)** 套件,它将 OWASP ZAP 自动化扫描与自定义的 TypeScript/Jest 安全测试相结合。它围绕一个**按设计存在漏洞的 Express API**(内置故意的 OWASP Top 10 场景)构建,并通过 CI 拦截机制在发现严重漏洞时阻止构建,同时将 HTML/JSON 格式的漏洞报告作为 artifacts 发布。
## 技术栈
| 工具 | 作用 |
|---|---|
| **OWASP ZAP** | 自动化 DAST 扫描(baseline、full、API spec-driven) |
| **TypeScript + Jest** | 针对各种漏洞类的自定义安全测试脚本 |
| **Snyk** | 结合严重性拦截机制的依赖项 CVE 扫描 |
| **GitHub Actions** | 包含安全任务和 artifact 发布的 CI pipeline |
| **Docker** | 在 headless 容器中运行 ZAP,与主机隔离 |
| **Express** | 按设计存在漏洞的 mock API(OWASP Top 10 场景) |
| **SQLite** | 用于真实注入场景的内存数据库 |
## 涵盖范围
### OWASP Top 10 — 2021
| ID | 类别 | 测试覆盖范围 |
|---|---|---|
| **A01** | 访问控制失效 | users、products 和 orders 的 IDOR;未认证删除;权限提升 |
| **A02** | 加密机制失效 | 密码哈希暴露;弱 JWT 密钥;敏感数据未加密 |
| **A03** | 注入 | SQL 注入(认证绕过、UNION、error-based);XSS(reflected、stored);LIKE 注入 |
| **A04** | 不安全设计 | 缺失速率限制;登录暴力破解;资源耗尽 |
| **A05** | 安全配置错误 | 缺失 CSP/HSTS/X-Frame-Options;通配符 CORS;堆栈跟踪暴露 |
| **A07** | 身份验证和授权失效 | 暴力破解;用户枚举;弱 JWT;Base64 token 伪造 |
| **A09** | 安全日志记录失效 | 管理员操作无审计日志;冗长的错误响应 |
### 扫描模式
| 模式 | 描述 |
|---|---|
| **Baseline** | 被动 + spider 扫描 —— 对任何环境都安全 |
| **Full** | 携带攻击 payload 的主动扫描 —— 每晚运行 |
| **API (OpenAPI)** | 针对所有已记录 endpoint 的 spec 驱动扫描 |
### 依赖项扫描
- Snyk 会根据 NVD/Snyk CVE 数据库扫描所有 `npm` 依赖项
- CI 拦截机制在任何出现 **Critical** CVE 或超过 **0 个 High** CVE 时失败
- 每次运行都会生成报告并作为 CI artifact 发布
## 项目结构
```
api-security-testing-suite/
├── .github/
│ └── workflows/
│ └── security-ci.yml # Full CI pipeline
├── .zap/
│ └── rules.tsv # ZAP rule configuration
├── src/
│ ├── mock-api/
│ │ ├── server.ts # Vulnerable Express server
│ │ ├── database.ts # SQLite schema + seed data
│ │ └── routes/
│ │ ├── auth-routes.ts # A07: Broken auth scenarios
│ │ ├── user-routes.ts # A01: IDOR + mass assignment
│ │ ├── product-routes.ts # A03: XSS + SQLi + IDOR
│ │ └── vulnerable-routes.ts # Explicit OWASP Top 10 endpoints
│ ├── zap/
│ │ ├── zap-scanner.ts # ZAP REST API client
│ │ └── run-zap-scan.ts # CLI entry point for ZAP scans
│ ├── ci/
│ │ └── security-gate.ts # Build gate — fails on high/critical
│ ├── reporting/
│ │ └── generate-report.ts # HTML + JSON report generator
│ └── tests/
│ ├── setup.ts
│ ├── teardown.ts
│ └── security/
│ ├── sql-injection.test.ts
│ ├── xss.test.ts
│ ├── broken-auth.test.ts
│ ├── idor.test.ts
│ └── rate-limiting.test.ts
├── openapi.yaml # OpenAPI 3.0 spec for API scan
├── docker-compose.yml # ZAP + API in containers
├── Dockerfile.api # Mock API container
└── reports/ # Generated — excluded from git
```
## 入门指南
### 前置条件
- Node.js 20+
- Docker(用于 ZAP 扫描)
- 一个 [Snyk 账户](https://snyk.io)和 token(用于依赖扫描,可选)
### 安装
```
git clone https://github.com/Djones-qa/api-security-testing-suite
cd api-security-testing-suite
npm install
```
### 运行 Mock API
```
npm run dev
# 服务器启动于 http://localhost:3000
```
### 运行安全测试 (Jest)
```
# 所有安全测试
npm run test:security
# 单个测试文件
npx jest src/tests/security/sql-injection.test.ts
```
### 运行 ZAP 扫描
**选项 A —— Docker Compose(推荐)**
```
# 启动 API + ZAP daemon
docker-compose up mock-api zap
# 运行 baseline scan
docker-compose --profile scan up zap-baseline
# 运行 full active scan
docker-compose --profile full-scan up zap-full
# 运行 OpenAPI spec-driven scan
docker-compose --profile api-scan up zap-api
```
**选项 B —— npm 脚本(需要在本地或通过 Docker 运行 ZAP)**
```
# Baseline scan
npm run zap:baseline
# Full scan
npm run zap:full
# API scan (OpenAPI)
npm run zap:api
```
### 生成报告
```
npm run report:generate
# 输出:reports/security-report.html + reports/security-report.json
```
### 运行安全拦截机制
```
npm run security:gate
# 读取 reports/,如果存在 high/critical findings 则退出 1
```
## CI Pipeline
GitHub Actions pipeline 会在每次推送、PR 和每晚定时任务时运行。
```
dependency-scan ──┐
├──► security-gate-summary ──► Pass / ❌ Block
security-tests ───┤
│
zap-scan ─────────┘
├── Baseline scan (every push)
├── Full scan (nightly + manual)
└── API scan (OpenAPI spec)
```
### 安全拦截机制阈值
| 严重性 | 允许的最大数量 |
|---|---|
| Critical | 0 |
| High | 0 |
| Medium | 10(仅警告) |
| Low | 无限制 |
每次运行发布的 CI artifacts:
- `zap-reports/` — ZAP HTML + JSON 报告
- `snyk-report/` — Snyk 依赖扫描 JSON
- `jest-test-results/` — Jest 覆盖率报告
### 必需的 Secrets
| Secret | 描述 |
|---|---|
| `SNYK_TOKEN` | 用于依赖扫描的 Snyk API token |
| `ZAP_API_KEY` | ZAP API key(默认:`changeme`) |
## 存在漏洞的 Endpoint 参考
| Endpoint | 漏洞 | OWASP |
|---|---|---|
| `GET /api/vuln/sqli?username=` | SQL 注入(认证绕过) | A03 |
| `GET /api/vuln/sqli/search?q=` | 基于 UNION 的 SQLi | A03 |
| `GET /api/vuln/xss/reflect?input=` | Reflected XSS | A03 |
| `POST /api/vuln/xss/store` | Stored XSS | A03 |
| `GET /api/vuln/idor/users/:id` | IDOR(任意用户) | A01 |
| `POST /api/vuln/no-rate-limit/login` | 暴力破解(无速率限制) | A04 |
| `GET /api/vuln/broken-auth/profile` | 伪造的 Base64 token | A07 |
| `GET /api/vuln/crypto/users` | 暴露的密码哈希 | A02 |
| `GET /api/vuln/config/info` | 服务器信息泄露 | A05 |
| `PUT /api/users/:id` | Mass assignment(角色权限提升) | A01 |
| `DELETE /api/users/:id` | 未认证的删除 | A01 |
| `GET /api/products/search/:query` | 通过 LIKE 进行的 SQL 注入 | A03 |
## 标签
`owasp` `zap` `dast` `security-testing` `api-security` `penetration-testing` `vulnerability-scanning` `snyk` `owasp-top-10` `ci-cd` `devsecops` `sql-injection` `xss` `broken-auth` `idor` `rate-limiting` `typescript` `jest` `docker` `github-actions` `rest-api` `express`
## 作者
**Darrius Jones**
[](https://github.com/Djones-qa)
[](https://linkedin.com/in/darrius-jones-28226b350)
## 许可证
本项目基于 **MIT License** 授权 —— 详情请参阅 [LICENSE](./LICENSE) 文件。
标签:DevSecOps, MITM代理, OWASP ZAP, REST API, 上游代理, 动态应用安全测试, 安全测试, 攻击性安全, 自动化攻击, 请求拦截