一次性 API 攻击工具 - 从给定的根 URL 中发现 API 地址并模拟自动化攻击
一个用 Python 编写的全流程黑盒 API 安全扫描器。它枚举端点、识别参数、探测 HTTP 方法、测试认证/授权逻辑,并运行标准的 OWASP API Top 10 攻击模拟(BOLA、Broken Auth、BFLA、Mass Assignment、Rate Limiting、SSRF、Security Misconfiguration 等),外加一个 RESTler 风格的可靠性模糊测试器,用于独立于任何 OWASP 类别地寻找崩溃/500 错误。
所有核心脚本均设计为 仅使用标准库(stdlib-only)。如果系统上不存在外部工具或库,apiharvester 会自动回退到纯 Python 实现,以保证开箱即用。
apiharvester/ — 主 Python 包目录。以 python3 -m apiharvester 运行。scripts/check_requirements.sh — 验证二进制文件 + 载荷(payload)前置条件。scripts/install_requirements.sh — 下载所需的 SecLists 载荷文件,并可选地安装二进制文件(通过 go install 和 pip)。apiharvester.py — 扫描器的独立单文件发行版。api_deep_discovery.py — 使用 Katana 无头浏览器代码的动态爬虫,用于动态 SPA/XHR 端点发现。api_intelligence_engine.py — 流水线聚合器和被动漏洞分类器。apisec.py — 备用的单文件安全扫描器版本。requirements.txt — Python 依赖列表(主要用于可选的基于 Python 的加速器)。payloads/ — 用于侦察的字典和载荷文件:
params.txt — 25,889 个用于 API 端点测试的参数名候选directories.txt — 62,281 个常见 API 路径模式和目录名subdomains.txt — 5,000 个用于 API 发现的子域名变体kiterunner/ — 用于加速端点枚举的 Kiterunner 路由模式文件验证需求: 运行只读脚本以检查核心工具/载荷是否可用:
./scripts/check_requirements.sh
安装可选工具和载荷文件: 运行安装脚本以自动获取 SecLists 顶级字典、Kiterunner 路由模式,并安装工具加速器:
./scripts/install_requirements.sh
安装 Python 包:
pip3 install -r requirements.txt
直接针对目标域名运行扫描器:
python3 -m apiharvester example.com \
--auth "Bearer eyJ..." \
--auth2 "Bearer eyJ_lowpriv..." \
--threads 20 \
--html report.html \
--json findings.jsonl
target(位置参数):要扫描的 FQDN 域名。--auth:用于认证检查的高权限访问令牌(例如,有效用户会话)。--auth2:用于 BOLA / BFLA / 跨账户权限提升测试的低权限访问令牌。--threads:线程池大小(默认:20)。--timeout:HTTP 请求超时时间(秒)(默认:10)。--burst:用于速率限制验证的快速请求数量(默认:20)。--json:保存 JSONL 格式报告(行分隔的 JSON 发现结果)。--html:保存交互式 HTML 仪表板报告。--output-dir:覆盖默认输出目录路径(例如 ./scans/example.com)。--skip-recon:跳过侦察阶段,使用先前运行的现有输出文件。--recon-dir:加载预先存在的侦察输出目录,仅运行攻击阶段。--attacks-only:仅运行攻击阶段(隐含 --skip-recon)。--attacks:要运行的逗号分隔攻击列表。默认:全部。可用:
bola,broken_auth,mass_assignment,rate_limit,bfla,business_logic,
ssrf,misconfiguration,inventory,sspp,injection,reliability,secrets
OWASP API Top 10(API1–API10:2023):
bola)— 失效的对象级授权。使用 ID 模糊测试(0、1、2、99、"admin"、"test"、UUID 变体等)和差异化认证令牌测试对象 ID 端点。broken_auth)— 未认证端点发现、JWT 弱密钥破解、alg=none 绕过、声明篡改、kid 注入,以及 OPTIONS/HEAD 方法绕过。mass_assignment)— 向 PUT/PATCH 请求体注入权限提升字段(role、is_admin、verified、balance 等)。rate_limit)— 发送 20+ 个快速请求;标记返回 200 而非 429 Retry-After 的端点。bfla)— 失效的功能级授权。使用和不使用低权限令牌测试敏感路径(/admin、/roles、/impersonate 等)。business_logic)— 工作流/状态机违规(例如,在付款后更新订单)。ssrf)— 测试通过 URL 参数和请求体进行的服务端请求伪造。misconfiguration)— CORS(主动:发送不受信任的 Origin)、缺失安全头、详细错误、服务器横幅泄露。inventory)— 未记录端点、废弃端点、暴露的管理界面。sspp)— 不安全的服务端后处理(模板注入、XPath 注入等)。附加攻击:
injection)— SQL 注入、XSS、命令注入(基于错误 + 基于时间的盲注)。reliability)— RESTler 风格模糊测试:边界/畸形输入测试,以发现 5xx 崩溃和服务器可靠性缺陷(独立于 OWASP 类别)。secrets)— 对响应体中的泄露凭据进行模式匹配:AWS Access Keys、Google API Keys、Slack Tokens、Stripe Keys、GitHub Tokens、Private Key Blocks、JWTs,以及通用密钥赋值(api_key=...、password=... 等)。使用认证 + 低权限令牌进行完整扫描(最适合 BOLA/BFLA):
python3 -m apiharvester api.example.com \
--auth "Bearer high_priv_token_here" \
--auth2 "Bearer low_priv_token_here" \
--html report.html \
--json findings.jsonl
快速仅侦察(发现端点,无攻击):
python3 -m apiharvester example.com --skip-recon --attacks ""
(或者只是不提供 --auth 以跳过某些攻击阶段。)
仅针对已保存的侦察数据重新运行攻击(快速迭代):
python3 -m apiharvester example.com --recon-dir output/example.com_20260715_140233 --attacks-only
仅运行特定攻击(例如 BOLA + Secrets):
python3 -m apiharvester example.com --attacks bola,secrets
绕过 TLS 证书错误(企业代理、预发布环境):
# apiharvester 默认使用宽松的 TLS 上下文 — 无需额外标志
# 所有 HTTPS 端点即使使用自签名/被拦截的证书也能工作
python3 -m apiharvester https://staging-api.example.com
每次扫描都会在攻击阶段运行之前,将其侦察产物写入结构化输出目录。默认情况下为:
output/{target}_{YYYYMMDD_HHMMSS}/
例如 output/example.com_20260715_140233/。如果你想要固定、可预测的路径(对脚本/CI 有用),可以使用 --output-dir /path/to/dir 覆盖位置。
| 文件 | 内容 |
|---|---|
fqdn.txt | 所有发现的子域名(每行一个) |
fqdn_resolved.txt | 已解析 IP 的子域名 — domain\tip1,ip2 |
fqdn_active.txt | 活跃的 HTTP(S) 主机(完整 URL) |
fqdnwithendpoint.txt | 所有发现的端点 URL |
withparam.txt | 带有发现的查询参数的端点,以完整 URL 形式 |
paramvalue.txt | 带有观察到的参数值的端点(来自实时探测) |
withtoken.txt | 通过 --auth/--auth2 提供的认证令牌/JWT,以及从响应中收集的任何令牌 |
objectshape.txt | 每个端点的响应 JSON 字段名 — url\tfield1,field2 |
waf_results.jsonl | 每个主机一个 JSON 对象,包含检测到的 WAF/全捕获/JS 挑战 |
endpoint_methods.jsonl | 每个端点一个 JSON 对象,列出允许的 HTTP 方法 |
swagger_specs/*.json | 发现的任何 OpenAPI/Swagger 规范,每个主机一个文件 |
所有内容都是纯文本(每行一个条目)或 JSONL,因此可以干净地使用 grep、jq 和管道。
仅针对现有侦察数据重新运行攻击阶段,跳过子域名发现/爬取等:
python3 -m apiharvester example.com --recon-dir output/example.com_20260715_140233 --attacks-only
--attacks-only 隐含 --skip-recon,并将 fqdn_active.txt、fqdnwithendpoint.txt、withparam.txt、withtoken.txt、swagger_specs/ 和 waf_results.jsonl 加载回扫描上下文。
将侦察文件输入其他工具:
# httpx 重新探测
httpx -l output/example.com_*/fqdn_active.txt
# 针对发现的端点运行 nuclei
nuclei -l output/example.com_*/fqdnwithendpoint.txt
# 使用发现的参数作为字典种子运行 ffuf
cut -d'?' -f2 output/example.com_*/withparam.txt | tr '&' '\n' | cut -d= -f1 | sort -u
# 对每个主机的 WAF 结果使用 jq
jq -r 'select(.waf_vendor != "none") | .domain' output/example.com_*/waf_results.jsonl
由于每个文件都是行分隔的纯文本或 JSONL,输出目录同时也是一个可移植的侦察数据集,你可以将其交给 grep、jq、httpx、nuclei、ffuf 或流水线中的任何其他工具 — 无需 apiharvester 专用解析器。
apiharvester 使用来自 SecLists 和 Kiterunner 的高质量字典和路由模式,用于全面的 API 发现和测试:
params.txt(25,889 个条目)— 常见 API 参数名(例如 api_key、user_id、token)。在参数发现阶段用于识别潜在输入点。
directories.txt(62,281 个条目)— API 端点路径和目录模式(例如 /api/v1/、/admin/、/internal/)。用于路径枚举和 Soft-404 检测。
subdomains.txt(5,000 个条目)— 子域名前缀和变体(例如 api、api-v2、staging-api)。用于识别跨子域名的额外 API 攻击面。
kiterunner/ — Kiterunner 格式的 OpenAPI 路由模式,用于快速路由发现和验证。当外部模式可用时,可实现加速的端点映射。
这些载荷来源于 SecLists(https://github.com/danielmiessler/SecLists),使 apiharvester 能够高效识别隐藏或未记录的 API 端点、参数和服务。
之前: 仅尝试可预测的 ID 交换(ID±1、UUID 最后一段翻转)。遗漏了具有弱 ID(1、2、"admin"、"test")的真实世界 IDOR。
现在: _generate_id_candidates() 为每个端点生成 5-13 个 ID 变体:
之前: 仅测试无认证的 GET。遗漏了 OPTIONS/HEAD 方法绕过(常见错误配置)。
现在: 还会在敏感路径上探测 OPTIONS/HEAD;许多服务器仅对 GET/POST 应用认证。
之前: 不检测响应中的凭据/API 密钥。
现在: 新增 secrets 攻击模块(8 种模式):
之前: 无崩溃/可靠性测试。
现在: 新增 reliability 攻击模块,使用以下内容进行模糊测试:
| 指标 | 默认值 | 说明 |
|---|---|---|
| 线程数 | 20 | 增加以加快发现速度(例如 --threads 50)。对嘈杂/限速目标则减少。 |
| 超时 | 10s | 对缓慢/远程目标增加(--timeout 30)。 |
| 输出 | output/{domain}_{timestamp}/ | 所有侦察文件均为纯文本/JSONL;可移植到其他工具。 |
| 速率限制测试 | 20 个请求 | 使用 --burst 50 调整以实现更激进的速率限制检测。 |
| 范围 | 完整域名 | 限制到特定子域名:python3 -m apiharvester api.example.com |