#open-api #specification #fuzzer #black-box #fuzzing #bug #json-format

app openapi-fuzzer

基于OpenAPI规范的API模糊测试器

5个版本

0.2.0 2023年8月30日
0.1.3 2021年11月16日
0.1.2 2021年11月16日
0.1.1 2021年4月7日
0.1.0 2021年4月7日

#2250 in Web编程

Download history 29/week @ 2024-03-13 15/week @ 2024-03-20 8/week @ 2024-03-27 22/week @ 2024-04-03 11/week @ 2024-04-10 4/week @ 2024-04-17 5/week @ 2024-04-24 7/week @ 2024-05-01 5/week @ 2024-05-08 7/week @ 2024-05-15 29/week @ 2024-05-22 13/week @ 2024-05-29 15/week @ 2024-06-05 57/week @ 2024-06-12 70/week @ 2024-06-19 47/week @ 2024-06-26

每月191次下载

AGPL-3.0或更高版本

36KB
701

OpenAPI模糊测试器

ci

基于OpenAPI规范的API模糊测试器。您只需提供API及其规范的URL。免费查找错误!

image

发现

该模糊测试器已用于在众多软件中查找错误。一些被模糊测试的知名软件包括[^1]

Kubernetes
Gitea
Vault

错误类别各不相同,但一些常见的错误包括解析错误、无效格式错误和查询不存在的实体。 如果您使用此模糊测试器发现了错误,请与我联系。我很乐意听到您的意见。 随意提交PR并添加您的发现到上面的列表中。

构建和安装

从crates.io

要构建模糊测试器,您需要安装Rust

cargo install openapi-fuzzer

从源代码

git clone [email protected]:matusf/openapi-fuzzer.git
cd openapi-fuzzer

# Install to the $PATH
cargo install --path .

# Or build inside the repo
cargo build --release

使用容器

podman pull ghcr.io/matusf/openapi-fuzzer

用法

安装完成后,您将拥有可用的openapi-fuzzer二进制文件,该文件提供两个子命令 - runresendrun 子命令将根据规范模糊测试API并报告任何发现。所有发现都将存储在名为 results 的目录中的JSON格式文件中(目录的名称可以由 --results-dir 标志指定)。

如果模糊测试器发现错误,它将保存导致触发错误的负载的种子。这些种子将保存在名为 openapi-fuzzer.regressions 的回归文件中。这些种子将在模糊测试器的下一次运行中使用,以检查错误是否仍然存在。您应将其保存与您的项目一起。

完成模糊测试后,您可以使用 openapi-fuzzer resend 重新发送触发错误的负载,并深入了解其原因。

OpenAPI fuzzer 支持 YAML 或 JSON 格式的 OpenAPI 规范版本 3。您可以在 editor.swagger.io 将旧版本进行转换。

提示

  • 当 fuzzer 接收到意外的状态码时,它会将其报告为一个发现。然而,许多 API 在规范中并未指定客户端错误状态码。为了最小化误报,可以使用 - 标志忽略您不感兴趣的状态码。建议分两阶段进行模糊测试。首先,不要使用 - 标志运行 fuzzer。然后检查 results 文件夹中的报告的发现。如果有您不关心的状态码的报告,请通过 - 标志添加它们并重新运行 fuzzer。
  • 大多数 API 使用一些基本前缀作为端点,如 /v1/api,但是规范有时会省略它。不要忘记在 URL 中包含路径前缀。
  • 您可以使用 - 标志添加额外的头信息。当您想要通过提供某种授权来增加覆盖率时,这可能很有用。
  • 目前,fuzzer 每个端点发出 256 个请求。如果所有接收到的响应都是预期的,它将声明端点正常并继续模糊测试下一个端点。您可以通过设置 --max-test-case-count 标志来调整此数字。
$ openapi-fuzzer run --help
Usage: openapi-fuzzer run -s <spec> -u <url> [-i <ignore-status-code>] [-H <header>] [--max-test-case-count <max-test-case-count>] [-o <results-dir>] [--stats-dir <stats-dir>]

run openapi-fuzzer

Options:
  -s, --spec        path to OpenAPI specification file
  -u, --url         url of api to fuzz
  -i, --ignore-status-code
                    status codes that will not be considered as finding
  -H, --header      additional header to send
  --max-test-case-count
                    maximum number of test cases that will run for each
                    combination of endpoint and method (default: 256)
  -o, --results-dir directory for results with minimal generated payload used
                    for resending requests (default: results).
  --stats-dir       directory for request times statistics. if no value is
                    supplied, statistics will not be saved
  --help            display usage information

$ openapi-fuzzer run -s ./spec.yaml -u http://127.0.0.1:8200/v1/ -i 404 -i 400

重新播放发现

完成模糊测试后,您可以重新播放发现。所有发现都存储在 results 文件夹中。每个文件的名称由端点、HTTP 方法和接收到的状态码连接而成。要向 API 重新发送相同的有效负载,您需要运行 openapi- 并指定发现文件的路径作为参数以及 API 的 URL。您还可以使用 - 标志覆盖头信息,这在需要授权时很有用。

$ ls -1 results/
api-v1-componentstatuses-{name}-GET-500.json
api-v1-namespaces-{namespace}-configmaps-GET-500.json
api-v1-namespaces-{namespace}-endpoints-GET-500.json
api-v1-namespaces-{namespace}-events-GET-500.json
api-v1-namespaces-{namespace}-limitranges-GET-500.json
api-v1-namespaces-{namespace}-persistentvolumeclaims-GET-500.json
api-v1-namespaces-{namespace}-pods-GET-500.json
api-v1-namespaces-{namespace}-podtemplates-GET-500.json
api-v1-namespaces-{namespace}-replicationcontrollers-GET-500.json
api-v1-namespaces-{namespace}-resourcequotas-GET-500.json
api-v1-namespaces-{namespace}-secrets-GET-500.json
api-v1-namespaces-{namespace}-serviceaccounts-GET-500.json
api-v1-namespaces-{namespace}-services-GET-500.json
api-v1-watch-namespaces-{name}-GET-500.json
...

$ openapi-fuzzer resend --help
Usage: openapi-fuzzer resend <file> [-H <header...>] -u <url>

resend payload genereted by fuzzer

Positional Arguments:
  file              path to result file generated by fuzzer

Options:
  -H, --header      extra header
  -u, --url         url of api
  --help            display usage information

$ openapi-fuzzer resend --url https://minikubeca:8443 results/api-v1-componentstatuses-\{name\}-GET-500.json -H "Authorization: Bearer $KUBE_TOKEN" | jq
500 (Internal Server Error)
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "Component not found: ኊ0",
  "code": 500
}

[^1]: 并非所有发现的漏洞都有链接

依赖项

~7–16MB
~224K SLoC