APIセキュリティツールやWAFの検出ロジックとバイパスを評価するためのGolang製オープンソースプロジェクト
GoTestWAFは、APIおよびOWASP攻撃シミュレーション用のツールであり、 REST、GraphQL、gRPC、SOAP、XMLRPCなど、幅広いAPIプロトコルをサポートしています。
これは、APIセキュリティプロキシ、Webアプリケーションファイアウォール、 IPS、APIゲートウェイなどのWebアプリケーションセキュリティソリューションを評価するために設計されました。
GoTestWAFは、HTTPリクエストのさまざまな部分(ボディ、ヘッダー、 URLパラメータなど)に配置されたエンコード済みペイロードを使用して、悪意のあるリクエストを生成します。生成されたリクエストは、GoTestWAFの起動時に指定されたアプリケーションセキュリティソリューションのURLに送信されます。 セキュリティソリューションの評価結果は、お使いのマシン上に作成されるレポートファイルに記録されます。
リクエスト生成のデフォルト条件は、testcasesフォルダ内の以下の形式のYAMLファイルで定義されています:```yaml
payload:
* `payload` は悪意のある攻撃サンプルです(例:```<script>alert(111)</script>``` のような XSS ペイロード、あるいはより巧妙なもの)。
ペイロードには YAML 文字列の形式が要求されるため、[バイナリデータとしてエンコード](https://yaml.org/type/binary.html)する必要があります。
* `encoder` は、ペイロードを HTTP リクエストに配置する前に適用するエンコーダーです。使用可能なエンコーダーは以下のとおりです:
* Base64
* Base64Flat
* JSUnicode
* URL
* Plain(ペイロード文字列をそのまま保持)
* XML Entity
* `placeholder` は、エンコードされたペイロードを配置する HTTP リクエスト内の場所です。使用可能なプレースホルダーは以下のとおりです:
* gRPC
* Header
* UserAgent
* RequestBody
* JSONRequest
* JSONBody
* HTMLForm
* HTMLMultipartForm
* SOAPBody
* XMLBody
* URLParam
* URLPath
* RawRequest
`RawRequest` プレースホルダーを使用すると、任意の HTTP リクエストを実行できます。ペイロードは、URL パス、ヘッダー、またはボディ内の文字列 `{{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` は、ファイル内のペイロードグループ全体の名前です。任意の名前を付けられますが、ファイル内の攻撃の種類を反映したものにするべきです。
リクエスト生成は、ペイロード数にエンコーダー数とプレースホルダー数を掛け合わせる 3 段階のプロセスです。
例えば、2 つの **payload**、3 つの **encoder**(Base64、JSUnicode、URL)、1 つの **placeholder**(URLParameter - HTTP GET パラメーター)を定義したとします。
この場合、GoTestWAF はテストケース内で 2x3x1 = 6 件のリクエストを送信します。
GoTestWAF の起動時には、組み込みの 2 つのテストケース(OWASP Top-10、OWASP-API)または独自のテストケース([設定オプション](#configuration-options) `testCasePath` を使用)から選択することもできます。
## 要件
* GoTestwaf はすべての一般的なオペレーティングシステム(Linux、Windows、macOS)をサポートしており、システムに [Go](https://golang.org/doc/install) がインストールされていればネイティブにビルドできます。GoTestWaf をネイティブに実行する場合は、PDF レポートを生成できるよう Chrome ウェブブラウザーがあることを確認してください。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)を使用してください。
## 評価結果の確認