以下是内容的中文翻译:
name: dast-zap description: > 使用OWASP ZAP(Zed Attack Proxy)进行动态应用安全测试(DAST),包括被动和主动扫描, API测试和OWASP Top 10漏洞检测。使用场景:(1) 对Web应用程序和API进行运行时安全测试,(2) 在部署的 应用程序中检测XSS、SQL注入和认证缺陷等漏洞,(3) 在CI/CD管道中使用Docker容器自动化安全扫描,(4) 进行 会话管理的认证测试,(5) 生成具有OWASP和CWE映射的安全性报告以符合合规性。 version: 0.1.0 maintainer: SirAppSec category: appsec tags: [dast, zap, web-security, owasp, vulnerability-scanning, api-testing, penetration-testing] frameworks: [OWASP, CWE] dependencies: tools: [docker] optional: [python3, java] references:
- https://www.zaproxy.org/docs/
- https://www.zaproxy.org/docs/docker/
- https://www.zaproxy.org/docs/desktop/start/features/
DAST与OWASP ZAP
概览
OWASP ZAP(Zed Attack Proxy)是一个开源DAST工具,作为中间人代理拦截、检查和测试Web应用程序流量以 寻找安全漏洞。ZAP提供自动化被动和主动扫描、API测试功能,并与CI/CD集成,实现运行时安全测试。
快速开始
基础扫描(Docker)
运行快速被动安全扫描:
docker run -t zaproxy/zap-stable zap-baseline.py -t https://target-app.com -r baseline-report.html
全面主动扫描(Docker)
进行全面的主动漏洞测试:
docker run -t zaproxy/zap-stable zap-full-scan.py -t https://target-app.com -r full-scan-report.html
API扫描与OpenAPI规范
使用OpenAPI/Swagger规范测试API:
docker run -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap-api-scan.py \
-t https://api.target.com \
-f openapi \
-d /zap/wrk/openapi-spec.yaml \
-r /zap/wrk/api-report.html
核心工作流程
第1步:定义扫描范围和目标
确定目标应用程序URL并定义范围:
# 设置目标URL
TARGET_URL="https://target-app.com"
# 对于认证扫描,准备认证上下文
# 详见references/authentication_guide.md中的详细设置
范围考虑因素:
- 排除第三方域名和CDN URL
- 包括所有应用程序子域和API端点
- 尊重渗透测试协议中的范围限制
第2步:运行被动扫描
执行被动扫描以分析流量而不进行主动攻击:
# 基础扫描执行爬虫+被动扫描
docker run -t zaproxy/zap-stable zap-baseline.py \
-t $TARGET_URL \
-r baseline-report.html \
-J baseline-report.json
被动扫描检测内容:
- 缺少安全头部(CSP、HSTS、X-Frame-Options)
- 响应中信息泄露
- Cookie安全问题(HttpOnly、Secure标志)
- 基本认证弱点
- 应用程序指纹数据
第3步:执行主动扫描
进行主动漏洞测试(需要授权):
# 全面扫描包括爬虫+被动+主动扫描
docker run -t zaproxy/zap-stable zap-full-scan.py \
-t $TARGET_URL \
-r full-scan-report.html \
-J full-scan-report.json \
-z "-config api.addrs.addr.name=.* -config api.addrs.addr.regex=true"
主动扫描覆盖范围:
- SQL注入(SQLi)
- 跨站脚本(XSS)
- 路径遍历
- 命令注入
- XML外部实体(XXE)
- 服务器端请求伪造(SSRF)
- 安全配置错误
警告: 主动扫描执行真实攻击。仅在您有明确授权测试的应用程序上运行。
第4步:使用规范测试API
扫描REST、GraphQL和SOAP API:
# OpenAPI/Swagger API扫描
docker run -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap-api-scan.py \
-t https://api.target.com \
-f openapi \
-d /zap/wrk/openapi.yaml \
-r /zap/wrk/api-report.html
# GraphQL API扫描
docker run -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap-api-scan.py \
-t https://api.target.com/graphql \
-f graphql \
-d /zap/wrk/schema.graphql \
-r /zap/wrk/graphql-report.html
参考references/api_testing_guide.md了解包括认证和速率限制在内的高级API测试模式。
第5步:处理认证
对于测试经过认证的应用程序区域:
# 使用捆绑脚本进行认证设置
python3 scripts/zap_auth_scanner.py \
--target $TARGET_URL \
--auth-type form \
--login-url https://target-app.com/login \
--username testuser \
--password-env ZAP_AUTH_PASSWORD \
--output auth-scan-report.html
支持的认证方法:
- 基于表单的认证
- HTTP基本/摘要认证
- OAuth 2.0流程
- API密钥/令牌认证
- 脚本自定义认证
详见references/authentication_guide.md了解详细的认证配置。
第6步:分析结果并生成报告
按风险等级审查发现:
# 生成多种报告格式
docker run -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap-full-scan.py \
-t $TARGET_URL \
-r /zap/wrk/report.html \
-J /zap/wrk/report.json \
-x /zap/wrk/report.xml
风险等级:
- 高:需要立即补救的关键漏洞(SQLi、RCE、认证绕过)
- 中:重大安全弱点(XSS、CSRF、敏感数据暴露)
- 低:较低可利用性的安全问题(信息披露、次要配置错误)
- 信息性:安全最佳实践和观察
使用references/owasp_mapping.md将发现映射到OWASP Top 10。
自动化与CI/CD集成
GitHub Actions集成
将ZAP扫描添加到GitHub工作流:
# .github/workflows/zap-scan.yml
name: ZAP安全扫描
on: [push, pull_request]
jobs:
zap_scan:
runs-on: ubuntu-latest
name: OWASP ZAP基础扫描
steps:
- name: Checkout
uses: actions/checkout@v2
- name: ZAP基础扫描
uses: zaproxy/action-baseline@v0.7.0
with:
target: 'https://staging.target-app.com'
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a'
Docker自动化框架
使用基于YAML的自动化进行高级工作流:
# 创建自动化配置(见assets/zap_automation.yaml)
docker run -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable \
zap.sh -cmd -autorun /zap/wrk/zap_automation.yaml
捆绑的assets/zap_automation.yaml模板包括:
- 环境配置
- 爬虫和AJAX爬虫设置
- 被动和主动扫描策略
- 认证配置
- 报告生成
CI/CD最佳实践
- 对每个提交/PR使用基础扫描(低误报)
- 在生产部署前对暂存环境运行全面扫描
- 为微服务和REST端点配置API扫描
- 设置失败阈值以在发现高严重性问题时中断构建
- 生成SARIF报告以集成到GitHub安全标签
详见scripts/ci_integration.sh了解完整的CI/CD集成示例。
安全考虑
- 授权:在扫描生产系统或第三方应用程序之前始终获得书面授权
- 速率限制:配置扫描速度以避免压垮目标应用程序或触发DDoS保护
- 敏感数据:永远不要在扫描配置中包含生产凭据;使用环境变量或秘密管理
- 扫描时间:在维护窗口期间或针对专用测试环境运行主动扫描
- 法律合规:遵守计算机欺诈和滥用法律;未经授权的扫描可能是非法的
- 审计日志:记录所有扫描执行、目标、发现和补救措施以进行合规性审计
- 数据保留:在共享之前清理扫描报告;它们可能包含敏感的应用程序数据
- 误报:在引发安全事件之前手动验证发现;DAST工具会产生误报
捆绑资源
脚本(scripts/)
zap_baseline_scan.sh- 自动化基础扫描,具有可配置的目标和报告zap_full_scan.sh- 具有排除规则的全面主动扫描zap_api_scan.py- 支持OpenAPI/GraphQL规范的API测试zap_auth_scanner.py- 支持多种认证方法的认证扫描ci_integration.sh- Jenkins、GitLab CI、GitHub Actions的CI/CD集成示例
参考(references/)
authentication_guide.md- 表单基础、OAuth和令牌认证的完整认证配置owasp_mapping.md- ZAP警报到OWASP Top 10 2021和CWE分类的映射api_testing_guide.md- REST、GraphQL、SOAP和WebSocket的高级API测试模式scan_policies.md- 不同应用程序类型的自定义扫描策略配置false_positive_handling.md- 常见误报和验证技术
资产(assets/)
zap_automation.yaml- 自动化框架配置模板zap_context.xml- 具有认证和会话管理的上下文配置scan_policy_modern_web.policy- 针对现代JavaScript应用程序优化的扫描策略scan_policy_api.policy- 针对REST和GraphQL API的扫描策略github_action.yml- GitHub Actions工作流模板gitlab_ci.yml- GitLab CI管道模板
常见模式
模式1:渐进式扫描(速度vs.覆盖范围)
从快速扫描开始,逐渐增加深度:
# 第1阶段:快速基础扫描(5-10分钟)
docker run -t zaproxy/zap-stable zap-baseline.py -t $TARGET_URL -r baseline.html
# 第2阶段:全面爬虫+被动扫描(15-30分钟)
docker run -t zaproxy/zap-stable zap-baseline.py -t $TARGET_URL -r baseline.html -c baseline-rules.tsv
# 第3阶段:针对关键端点的针对性主动扫描(1-2小时)
docker run -t zaproxy/zap-stable zap-full-scan.py -t $TARGET_URL -r full.html -c full-rules.tsv
模式2:API优先测试
优先API安全测试:
# 1. 使用规范测试API端点
docker run -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap-api-scan.py \
-t https://api.target.com -f openapi -d /zap/wrk/openapi.yaml -r /zap/wrk/api.html
# 2. 在发现的API端点上运行主动扫描
# (ZAP自动包括爬虫API路由)
# 3. 测试认证流程
python3 scripts/zap_auth_scanner.py --target https://api.target.com --auth-type bearer --token-env API_TOKEN
模式3:认证Web应用程序测试
测试包括受保护区域的完整应用程序:
# 1. 配置认证上下文
# 见assets/zap_context.xml模板
# 2. 运行认证扫描
python3 scripts/zap_auth_scanner.py \
--target https://app.target.com \
--auth-type form \
--login-url https://app.target.com/login \
--username testuser \
--password-env APP_PASSWORD \
--verification-url https://app.target.com/dashboard \
--output authenticated-scan.html
# 3. 审查会话特定漏洞(CSRF、权限提升)
模式4:CI/CD安全门
在部署管道中实施ZAP作为安全门:
# 运行基础扫描并在发现高风险漏洞时失败构建
docker run -t zaproxy/zap-stable zap-baseline.py \
-t https://staging.target.com \
-r baseline-report.html \
-J baseline-report.json \
--hook=scripts/ci_integration.sh
# 检查退出代码
if [ $? -ne 0 ]; then
echo "安全扫描失败!发现高风险漏洞。"
exit 1
fi
集成点
- CI/CD: GitHub Actions, GitLab CI, Jenkins, Azure DevOps, CircleCI
- 问题跟踪: Jira, GitHub Issues(通过SARIF), ServiceNow
- 安全工具: Defect Dojo(漏洞管理), SonarQube, OWASP Dependency-Check
- SDLC: 预生产测试阶段,安全回归测试,渗透测试准备
- 认证: 与OAuth提供商、SAML、API网关、自定义认证脚本集成
- 报告: HTML, JSON, XML, Markdown, SARIF(GitHub Security), PDF(通过自定义脚本)
故障排除
问题:Docker容器无法访问目标应用程序
解决方案:对于在localhost上运行或在其他容器中扫描应用程序:
# 从Docker容器扫描主机应用程序
# 使用docker0桥IP代替localhost
HOST_IP=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')
docker run -t zaproxy/zap-stable zap-baseline.py -t http://$HOST_IP:8080
# 容器间扫描 - 创建共享网络
docker network create zap-network
docker run --network zap-network -t zaproxy/zap-stable zap-baseline.py -t http://app-container:8080
问题:扫描完成得太快(覆盖范围不完整)
解决方案:增加爬虫深度和扫描持续时间:
# 配置爬虫深入爬行
docker run -t zaproxy/zap-stable zap-baseline.py \
-t $TARGET_URL \
-r report.html \
-z "-config spider.maxDepth=10 -config spider.maxDuration=60"
对于JavaScript密集型应用程序,请使用AJAX爬虫或自动化框架。
问题:误报率太高
解决方案:创建自定义扫描策略和规则文件:
# 使用捆绑的误报处理指南
# 见references/false_positive_handling.md
# 生成规则文件以抑制误报
# 格式:alert_id URL_pattern parameter CWE_id WARN|IGNORE|FAIL
echo "10202 https://target.com/static/.* .* 798 IGNORE" >> .zap/rules.tsv
docker run -t zaproxy/zap-stable zap-baseline.py -t $TARGET_URL -c .zap/rules.tsv
问题:认证会话在扫描期间过期
解决方案:配置会话重新认证:
# 使用捆绑的认证脚本与会话监控
python3 scripts/zap_auth_scanner.py \
--target $TARGET_URL \
--auth-type form \
--login-url https://target.com/login \
--username testuser \
--password-env PASSWORD \
--re-authenticate-on 401,403 \
--verification-interval 300
问题:扫描触发速率限制或WAF阻止
解决方案:降低扫描侵略性:
# 带有请求间延迟的慢速扫描
docker run -t zaproxy/zap-stable zap-baseline.py \
-t $TARGET_URL \
-r report.html \
-z "-config scanner.threadPerHost=1 -config scanner.delayInMs=1000"