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编程
每月191次下载
36KB
701 行
OpenAPI模糊测试器
基于OpenAPI规范的API模糊测试器。您只需提供API及其规范的URL。免费查找错误!
发现
该模糊测试器已用于在众多软件中查找错误。一些被模糊测试的知名软件包括[^1]
Kubernetes
错误类别各不相同,但一些常见的错误包括解析错误、无效格式错误和查询不存在的实体。 如果您使用此模糊测试器发现了错误,请与我联系。我很乐意听到您的意见。 随意提交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
二进制文件,该文件提供两个子命令 - run
和 resend
。 run
子命令将根据规范模糊测试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