
一个用 Golang 编写的开源项目,用于评估不同的 API 安全工具和 WAF 的检测逻辑及绕过方法。
GoTestWAF 是一款用于 API 和 OWASP 攻击模拟的工具,支持多种 API 协议,包括 REST、GraphQL、gRPC、SOAP、XMLRPC 等。
它旨在评估 Web 应用安全解决方案,例如 API 安全代理、Web 应用防火墙、 IPS、API 网关等。
GoTestWAF 使用放置在 HTTP 请求不同部分(请求体、请求头、 URL 参数等)中的编码载荷来生成恶意请求。生成的请求会被发送到 GoTestWAF 启动时指定的应用安全解决方案 URL。 安全解决方案的评估结果会记录在您机器上生成的报告文件中。
请求生成的默认条件定义在 testcases 文件夹中,采用以下格式的 YAML 文件:```yaml
payload:
* `payload` 是恶意攻击样本(例如像 ```<script>alert(111)</script>``` 这样的 XSS payload,或者更复杂的样本)。
由于 payload 需要符合 YAML 字符串的格式,它们必须[编码为二进制数据](https://yaml.org/type/binary.html)。
* `encoder` 是在将 payload 放入 HTTP 请求之前要应用的编码器。可用的编码器有:
* Base64
* Base64Flat
* JSUnicode
* URL
* Plain(保持 payload 字符串原样)
* XML Entity
* `placeholder` 是 HTTP 请求中应放置编码后 payload 的位置。可用的占位符有:
* gRPC
* Header
* UserAgent
* RequestBody
* JSONRequest
* JSONBody
* HTMLForm
* HTMLMultipartForm
* SOAPBody
* XMLBody
* URLParam
* URLPath
* RawRequest
`RawRequest` 占位符允许你执行任意 HTTP 请求。payload 通过替换 URL 路径、Headers 或 body 中的字符串 `{{payload}}` 来注入。`RawRequest` 占位符的字段:
* `method`
* `path`
* `headers`
* `body`
`RawRequest` 占位符的必填字段:
* `method` 字段
示例:
```yaml
payload:
- test
encoder:
- Plain
placeholder:
- RawRequest:
method: "POST"
path: "/"
headers:
Content-Type: "multipart/form-data; boundary=boundary"
body: |
--boundary
Content-disposition: form-data; name="field1"
Test
--boundary
Content-disposition: form-data; name="field2"
Content-Type: text/plain; charset=utf-7
Knock knock.
{{payload}}
--boundary--
type: RawRequest test
```
* `type` 是文件中整个 payload 组的名称。它可以任意命名,但应反映文件中的攻击类型。
请求生成是一个三步过程,涉及将 payload 数量与编码器和占位符数量相乘。
假设你定义了 2 个 **payload**、3 个 **encoder**(Base64、JSUnicode 和 URL)以及 1 个 **placeholder**(URLParameter - HTTP GET 参数)。
在这种情况下,GoTestWAF 将在一个测试用例中发送 2x3x1 = 6 个请求。
在启动 GoTestWAF 时,你还可以在两个内置测试用例之间进行选择:OWASP Top-10、OWASP-API,
或使用你自己的测试用例(通过[配置选项](#configuration-options) `testCasePath`)。
## 要求
* GoTestwaf 支持所有主流操作系统(Linux、Windows、macOS),如果系统中安装了 [Go](https://golang.org/doc/install),则可以原生构建。如果你想原生运行 GoTestWaf,
请确保你拥有 Chrome 网络浏览器,以便能够生成 PDF 报告。如果你没有 Chrome,
则可以创建 HTML 格式的报告。
* 如果将 GoTestWAF 作为 Docker 容器运行,请确保你已[安装并配置 Docker](https://docs.docker.com/get-docker/),
并且 GoTestWAF 与被评估的应用安全解决方案连接到同一个 [Docker 网络](https://docs.docker.com/network/)。
* 为了让 GoTestWAF 成功启动,请确保运行 GoTestWAF 的机器的 IP 地址已加入
运行应用安全解决方案的机器的白名单。
## 使用 Docker 快速开始
以下步骤将引导你以最小配置在 Docker 上下载并启动 GoTestWAF。
1. 从 Docker Hub 拉取 [GoTestWAF 镜像](https://hub.docker.com/r/wallarm/gotestwaf):
```
docker pull wallarm/gotestwaf
```
2. 启动 GoTestWAF 镜像:
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
```
如有需要,你可以将 `${PWD}/reports` 替换为用于放置评估报告的其他文件夹路径。
如果你不想可选地通过电子邮件发送报告,只需在电子邮件请求消息出现后按 Enter,或者你可以使用 --noEmailReport 跳过该消息:
```sh
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL> --noEmailReport
```
如果被评估的安全工具可从外部访问,你可以跳过 `--network="host"` 选项。此选项启用运行在 127.0.0.1 上的 Docker 容器之间的交互。
要执行 gRPC 测试,你必须有一个可用的端点,并使用 --grpcPort <port> cli 选项。
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --grpcPort 9000 --url=http://my.grpc.endpoint
```
3. 检查你的电子邮件以获取报告。
你已使用最小配置通过 GoTestWAF 成功评估了你的应用安全解决方案。
要了解高级配置选项,请使用此[链接](#configuration-options)。
## 检查评估结果