关于 dynamic-application-security-testing
此技能帮助 Agent 对运行中的 Web 应用和 API 执行动态安全测试,适用于安全测试人员和开发团队。它涵盖扫描配置、结果核验及修复报告,并强调授权范围与降低测试影响。
主要功能
- 01配置扫描范围与策略
- 02设置登录和 API 认证
- 03运行应用与 API 扫描
- 04按严重性分析并核验发现
- 05生成含修复建议的报告
- 06比较并安排定期扫描
适用场景
- 01检查暂存环境中的 Web 应用漏洞
- 02验证需认证的 API 端点
- 03部署后比较漏洞扫描结果
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ seb1n/ awesome-ai-agent-skills --skill dynamic-application-security-testing安装后在 Claude Code 中输入/dynamic-application-security-testing确认已加载。
详细介绍
动态应用安全测试
此技能可让 Agent 对正在运行的 Web 应用和 API 执行动态应用安全测试(DAST)。与静态分析不同,DAST 会在运行时与应用交互——发送精心构造的 HTTP 请求、对输入参数进行模糊测试,并分析响应,以检测 SQL 注入、跨站脚本、服务器配置错误、身份验证缺陷和不安全的 API 端点等漏洞。Agent 会配置扫描配置文件、处理已通过身份验证的扫描、解读结果,并生成可执行的修复报告。
工作流
-
定义目标范围和扫描策略 — 指定目标 URL、应用类型(传统 Web 应用、SPA、REST API、GraphQL)和扫描边界。定义范围内的路径和域名,以避免扫描非预期目标。选择扫描策略:用于低风险侦察的仅被动扫描、用于全面漏洞探测的主动扫描,或用于端点模糊测试的 API 专用扫描。
-
配置身份验证 — 对于需要登录的应用,使用有效凭据或会话令牌配置扫描器。通过指定登录 URL、用户名/密码字段和已登录状态指示字符串,设置基于表单的身份验证。对于 API 测试,配置 Bearer 令牌、API 密钥或 OAuth 流程,以便扫描器访问需要身份验证的端点。
-
执行 DAST 扫描 — 使用选定的工具(OWASP ZAP、Burp Suite 或 Nuclei)启动扫描。扫描器首先爬取应用以发现端点,然后使用攻击载荷主动探测每个端点。监控扫描进度和资源消耗,避免对目标环境造成过大负载。
-
分析并分类发现项 — 查看扫描结果,并按漏洞类型、严重性(使用 CVSS)、置信度级别和受影响的 URL 对每项发现进行分类。通过验证报告中的响应是否确实表明存在漏洞,过滤掉信息性噪声和误报。
-
生成修复报告 — 生成结构化报告,其中包含每项发现的存在漏洞的 URL、HTTP 请求/响应证据、严重性评级、CWE 标识符、OWASP 类别映射以及具体的修复指南。导出为 HTML、JSON 或 SARIF 格式,以便与问题跟踪工具集成。
-
安排定期扫描 — 将扫描配置为定期运行(例如,每晚扫描暂存环境),或在部署到 QA 环境时触发扫描。比较多次扫描的结果,以跟踪修复进度并检测新引入的漏洞。
支持的技术
- DAST 工具:OWASP ZAP、Burp Suite Professional/Enterprise、Nuclei、Nikto、Arachni
- 目标类型:传统 Web 应用、单页应用(React、Angular、Vue)、REST API、GraphQL API、WebSocket 端点
- 身份验证:基于表单的登录、HTTP Basic/Digest、Bearer 令牌、API 密钥、OAuth 2.0 流程
- 输出格式:HTML 报告、JSON、XML、SARIF、Markdown
- CI/CD 集成:GitHub Actions、GitLab CI、Jenkins、Azure Pipelines
用法
向 Agent 提供目标 URL、所需的身份验证凭据以及期望的扫描深度。Agent 将配置扫描器、执行测试并提交按优先级排序的发现报告。
提示词示例:
Run a DAST scan against our staging application at https://staging.example.com. Use OWASP ZAP with the login form at /login (username: testuser, password: Test@1234). Scan all API endpoints under /api/v2 and generate an HTML report.
示例
示例 1:使用 OWASP ZAP 扫描 Web 应用
带身份验证的 ZAP Docker 命令:
docker run --rm -v $(pwd)/report:/zap/wrk owasp/zap2docker-stable zap-full-scan.py \
-t https://staging.example.com \
-r zap-report.html \
-J zap-report.json \
-c zap-config.conf \
--hook=zap-auth-hook.py \
-z "-config formhandler.fields.field(0).fieldId=username \
-config formhandler.fields.field(0).value=testuser \
-config formhandler.fields.field(1).fieldId=password \
-config formhandler.fields.field(1).value=Test@1234"
发现报告(节选):
| # | 风险 | 警报 | URL | CWE | OWASP | 置信度 |
|---|---|---|---|---|---|---|
| 1 | 高 | SQL 注入 | POST /api/v2/search | CWE-89 | A03:2021 | 高 |
| 2 | 高 | 跨站脚本(反射型) | GET /search?q=<script> | CWE-79 | A03:2021 | 高 |
| 3 | 中 | 缺少 Anti-CSRF 令牌 | POST /api/v2/profile/update | CWE-352 | A01:2021 | 中 |
| 4 | 中 | Cookie 缺少 Secure 标志 | Set-Cookie: session=... | CWE-614 | A05:2021 | 高 |
| 5 | 低 | 缺少 X-Content-Type-Options 标头 | 所有响应 | CWE-693 | A05:2021 | 高 |
| 6 | 低 | 服务器泄露版本信息 | Server: Apache/2.4.49 | CWE-200 | A05:2021 | 高 |
发现项 #1 的证据——SQL 注入:
Request:
POST /api/v2/search HTTP/1.1
Content-Type: application/json
{"query": "test' OR '1'='1' --"}
Response:
HTTP/1.1 200 OK
[returned all 4,892 records instead of matching records]
Remediation: Use parameterized queries or ORM methods. Validate and sanitize
all user input before including it in database queries.
示例 2:用于检测暴露的调试端点的自定义 Nuclei 模板
自定义模板(exposed-debug-endpoints.yaml):
id: exposed-debug-endpoints
info:
name: Exposed Debug/Admin Endpoints
author: security-team
severity: high
description: Detects debug and admin endpoints that should not be publicly accessible.
tags: misconfiguration,exposure
classification:
cwe-id: CWE-489
cvss-score: 7.5
http:
- method: GET
path:
- "{{BaseURL}}/debug"
- "{{BaseURL}}/actuator"
- "{{BaseURL}}/actuator/env"
- "{{BaseURL}}/graphql/playground"
- "{{BaseURL}}/_profiler"
- "{{BaseURL}}/elmah.axd"
- "{{BaseURL}}/phpinfo.php"
stop-at-first-match: false
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "debug"
- "actuator"
- "environment"
- "playground"
condition: or
运行扫描:
nuclei -u https://staging.example.com -t exposed-debug-endpoints.yaml -t cves/ -severity high,critical -json -o nuclei-results.json
输出示例:
[exposed-debug-endpoints] [http] [high] https://staging.example.com/actuator/env
[exposed-debug-endpoints] [http] [high] https://staging.example.com/graphql/playground
[CVE-2021-44228] [http] [critical] https://staging.example.com/api/v2/log
最佳实践
- 扫描预发布环境,绝不扫描生产环境 — DAST 会主动发送攻击载荷,可能破坏数据、触发警报或导致服务中断。务必将目标设为与生产环境相似的预发布或 QA 环境。
- 结合被动扫描和主动扫描 — 先使用被动爬虫映射应用,而不发送攻击载荷;然后对发现的端点运行主动扫描,以实现全面覆盖。
- 正确配置身份验证 — 未经身份验证的 DAST 扫描只能测试登录页面和公开端点。大多数实际漏洞都存在于需要身份验证的流程中,因此务必配置有效的会话凭据。
- 设置扫描范围边界 — 明确指定范围内的域名和路径。如果没有边界,扫描器可能会跟随链接访问第三方网站、CDN 或支付服务提供商,从而造成意外后果。
- 随时间推移对比扫描基线 — 保存扫描结果,并将每次新运行的结果与上一基线进行比较。这有助于发现新引入的漏洞,并确认先前报告的问题已修复。
- 将 DAST 与 SAST 配合使用 — DAST 可发现 SAST 遗漏的运行时问题(配置错误、部署错误),而 SAST 可发现 DAST 无法触及的代码级缺陷。两者结合使用可实现全面覆盖。
安全边界
- 仅在用户拥有或明确授权评估的系统上操作,并在测试前记录获批范围。
- 从被动或只读检查开始。进行主动扫描、漏洞利用、负载生成或有影响的修复前,须获得明确批准。
- 切勿暴露机密、提取无关数据、削弱生产环境控制措施,或超出获批目标范围。
- 保留证据,将影响降至最低;出现不稳定情况时立即停止,并为每项重大变更提供回滚或遏制步骤。
边缘情况
- 采用客户端路由的单页应用 — 传统爬虫无法发现 React、Angular 或 Vue 应用中的路由,因为链接由 JavaScript 渲染。使用 ZAP 的 AJAX Spider 或基于无头浏览器的爬虫,才能正确发现 SPA 端点。
- 没有 UI 的纯 API 应用 — 如果没有可供爬取的 Web UI,请将 OpenAPI/Swagger 规范或 Postman 集合直接导入扫描器,以定义所有端点、参数和预期请求格式。
- 受到速率限制或 WAF 保护的目标 — 激进扫描可能触发速率限制或 WAF 拦截,导致漏报。降低扫描速率、在 WAF 中将扫描器 IP 列入允许列表,或直接测试源服务器,以获得准确结果。
- WebSocket 和实时端点 — 大多数 DAST 工具专注于 HTTP 请求/响应模式。WebSocket 连接需要专用工具或手动测试,才能探查实时消息流中的注入和授权问题。
- 有状态的多步骤工作流 — 结账、密码重置或 MFA 注册等流程中的漏洞,需要扫描器按特定步骤顺序执行。定义扫描序列或使用录制的宏,端到端地测试这些工作流。