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 安全测试套件 [![Security CI](https://img.shields.io/github/actions/workflow/status/Djones-qa/api-security-testing-suite/security-ci.yml?branch=master&label=Security%20CI&logo=github-actions&logoColor=white)](https://github.com/Djones-qa/api-security-testing-suite/actions) [![OWASP ZAP](https://img.shields.io/badge/OWASP%20ZAP-Enabled-brightgreen?logo=owasp&logoColor=white)](https://www.zaproxy.org/) [![Snyk](https://img.shields.io/badge/Snyk-Protected-4C4A73?logo=snyk&logoColor=white)](https://snyk.io/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.3-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) [![Jest](https://img.shields.io/badge/Jest-29-C21325?logo=jest&logoColor=white)](https://jestjs.io/) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ED?logo=docker&logoColor=white)](https://www.docker.com/) [![Node.js](https://img.shields.io/badge/Node.js-20-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [![OWASP Top 10](https://img.shields.io/badge/OWASP%20Top%2010-2021-red)](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** [![GitHub](https://img.shields.io/badge/GitHub-Djones--qa-181717?logo=github&logoColor=white)](https://github.com/Djones-qa) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Darrius%20Jones-0A66C2?logo=linkedin&logoColor=white)](https://linkedin.com/in/darrius-jones-28226b350) ## 许可证 本项目基于 **MIT License** 授权 —— 详情请参阅 [LICENSE](./LICENSE) 文件。
标签:DevSecOps, MITM代理, OWASP ZAP, REST API, 上游代理, 动态应用安全测试, 安全测试, 攻击性安全, 自动化攻击, 请求拦截