
WAFの機能をテストするためのプログラム
エンタープライズWAF評価ツール — 実際の攻撃ペイロード。実際の結果。コンプライアンス対応レポート。
WAF Testerは、ユーザーが指定したURLに実際の攻撃ペイロードを送信し、それらがブロックされたかどうかをレポートすることで、Webアプリケーションファイアウォール(WAF)を評価します。Windowsデスクトップアプリ(Electron)と、どこでも実行可能なPython CLIとして提供されます。

このツールは、許可されたセキュリティテスト専用です。 自分が所有しているシステム、またはテストの明示的な書面による許可を得ているシステムに対してのみ使用してください。 第三者のシステムを許可なくテストすると、コンピュータ詐欺および不正使用防止法(CFAA)および管轄区域の同等の法律に違反する可能性があります。 著者は誤用に対する一切の責任を負いません。
| スイート | テスト数 | 内容 |
|---|---|---|
| OWASP / CWE コア | 44 | SQLインジェクション(12種類)、XSS(10種類)、パストラバーサル、コマンドインジェクション、XXE、SSRF、Log4Shell、SSTI、オープンリダイレクト |
| レート制限 | 3 | バーストフラッド(30同時接続)、シーケンシャルフラッド、X-Forwarded-For IPローテーションによるバイパス |
| ボット検出 | 10 | sqlmap、Nikto、Nmap、Scrapy、Masscan、HeadlessChrome、python-requests、curl、空のUA、Acceptヘッダー欠落 |
| バイパス試行 | 15 | 二重URLエンコード、Unicode全角、ヌルバイト、大文字小文字の変化、コメント難読化、CRLFインジェクション、ホストヘッダーインジェクション、メソッドオーバーライド、パストリック |
| APIセキュリティ | 10 | GraphQLイントロスペクション/バッチ/列挙、JWT noneアルゴリズム & アルゴリズム混乱、大量割り当て、HTTP動詞改ざん、BOLA、コンテンツタイプ混乱 |
| ビジネスロジック | 8 | 負の数量、ゼロ価格の送信、管理エンドポイントへのアクセス、HTTPパラメータ汚染、アカウント列挙、過剰なデータ公開、強制ブラウジング、権限昇格 |
すべてのテストは、1つ以上のコンプライアンスフレームワークにタグ付けされています:
HIGH、LIKELY、UNCERTAIN で評価git clone https://github.com/kpomin57/waf-tester.git
cd waf-tester
npm install
npm start
npm run build
出力は dist/ に、NSISインストーラーとポータブル .exe の両方として生成されます。ターゲットマシンに前提条件は不要です — Electronが独自のランタイムをバンドルしています。
Pythonが利用可能な任意の環境(Linuxサーバー、CI/CDパイプライン、Dockerコンテナ、WSL、またはWindows .exe が使用できない環境)で実行できる単一ファイルのPythonバージョンです。
pip install rich requests
python waf_tester.py --url https://target.example.com
すべての90テストを実行し、許可確認を求め、色分けされた結果をターミナルに表示し、JSONレポートとHTMLレポートの両方をカレントディレクトリに保存します。
# すべてのスイートを実行
python waf_tester.py --url https://app.example.com
# OWASPとAPIスイートのみ実行
python waf_tester.py --url https://app.example.com --suites owasp,api
# Bearerトークン認証
python waf_tester.py --url https://app.example.com/api \
--auth-type bearer --auth-value eyJhbGciOiJIUzI1NiJ9...
# APIキー認証
python waf_tester.py --url https://app.example.com/api \
--auth-type apikey --auth-header X-API-Key --auth-value mykey123
# レポートをフォルダに保存、確認をスキップ(CI/CD)
python waf_tester.py --url https://app.example.com \
--output-dir ./reports --confirm
# ターミナル出力のみ — ファイルは保存しない
python waf_tester.py --url https://app.example.com --output terminal
# Burp Suite経由でトラフィックをルーティング
python waf_tester.py --url https://app.example.com --proxy http://127.0.0.1:8080
docker run --rm -v $(pwd)/reports:/reports \
python:3.12-slim sh -c \
"pip install rich requests -q && python waf_tester.py \
--url https://target.example.com \
--output-dir /reports --confirm"
- name: WAF評価
run: |
pip install rich requests
python waf_tester.py \
--url ${{ secrets.WAF_TARGET_URL }} \
--suites owasp,api,bypass \
--output json \
--output-dir ./reports \
--confirm
- name: レポートのアップロード
uses: actions/upload-artifact@v3
with:
name: waf-report
path: reports/
Python CLIは、すべてのテストトラフィックをBurp Suite経由でルーティングできるため、WAF Testerが送信するすべてのペイロードの完全なHTTP履歴を取得できます。これは、リクエストとレスポンスの手動検査、ペイロードの微調整、予期しないWAF動作のトラブルシューティング、興味深い発見に対するBurp独自のスキャナーやリピーターの使用に役立ちます。
Burp Suiteはローカルプロキシリスナー(デフォルト 127.0.0.1:8080)を実行します。WAF Testerのプロキシ環境変数をそのアドレスに向けると、ツールが行うすべてのリクエストがターゲットに到達する前にBurpを通過します。各ペイロードは、完全なリクエストとレスポンス(ステータスコード、ヘッダー、ボディ)とともにBurpのHTTP履歴に表示され、WAFが見たものとまったく同じになります。
1. Burp Suiteを起動し、プロキシリスナーがアクティブであることを確認します:
Burpを開く → Proxy → Proxy Settings → リスナーが 127.0.0.1:8080 で動作していることを確認します(異なる場合はポートをメモします)。
2. BurpのCA証明書をエクスポートして信頼します(初回のみ):
WAF TesterはHTTPSターゲットに接続するため、BurpはTLSをインターセプトする必要があります。Burp → Proxy → Proxy Settings → Import/Export CA Certificate → Export as DER に進みます。システムの信頼されたルートCAとしてインストールするか、以下の環境変数を設定して検証をスキップします(ラボでの使用には問題ありませんが、本番環境では推奨しません)。
3. --proxy を使用してWAF Testerを実行します:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
Windowsの場合:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
環境変数を使用することもできます:
HTTPS_PROXY=http://127.0.0.1:8080 HTTP_PROXY=http://127.0.0.1:8080 \
python waf_tester.py --url https://target.example.com
4. Burpのインターセプトをオフにします:
Burp → Proxy → Intercept で、インターセプトがオフになっていることを確認します。そうしないと、Burpはリクエストごとに手動で転送するのを待って停止し、WAF Testerがタイムアウトします。Burpはトラフィックをインターセプトするのではなく、受動的にログに記録するようにします。
5. BurpのHTTP履歴にリクエストが到着するのを確認します:
各WAF Testerペイロードは個別のエントリとして表示されます。任意のリクエストを右クリックしてRepeaterに送信し、手動で調整して再送信したり、Intruderに送信してさらなるファジングを行うことができます。
BurpのCA証明書が信頼されていない場合は、ツールのSSL検証を一時的に無効にする --no-verify 回避策を使用します。または、BurpのCA証明書をシステム全体で信頼するか、最初のテストにはHTTP(HTTPSではない)ターゲットを使用します。
信頼度レベル:
HIGH — あいまいさのないハードブロックステータス(403、406、429)LIKELY — レスポンスボディにWAFキーワードがある、またはステータスがベースラインと異なるUNCERTAIN — ソフトブロック(400、503)で、正当なアプリエラーの可能性がある# Juice Shop(WAFなし — すべてバイパスされることを期待)
docker run -d -p 3000:3000 bkimminich/juice-shop
# ModSecurity with OWASP CRS(ほとんどブロックされることを期待)
docker run -d -p 80:80 owasp/modsecurity-crs:nginx
waf-tester/
├── src/
│ ├── main.js # Electronメインプロセス — すべてのテストロジック & IPC
│ ├── preload.js # セキュアコンテキストブリッジ
│ └── renderer/
│ ├── index.html # アプリシェル
│ ├── styles.css # ダークミリタリー/SOC UIテーマ
│ └── app.js # UIロジック、フィルター、ライブフィード、エクスポート
├── waf_tester.py # Python CLI — 単一ファイル、設定不要
├── package.json
└── README.md
waf_tester.py)を追加 — 単一ファイル、どこでも実行可能MIT — 詳細はLICENSEを参照してください。
チェックボックスコンプライアンスを超えたWAF検証を必要とするセキュリティエンジニアのために作られました。
| フラグ | 説明 | デフォルト |
|---|
--url | ターゲットURL (必須) | — |
--suites | 実行するスイート(カンマ区切り) | all |
--auth-type | none / bearer / apikey / cookie / basic | none |
--auth-value | トークン、Cookie文字列、またはAPIキー値 | — |
--auth-header | APIキー認証用のヘッダー名 | X-API-Key |
--auth-user | Basic認証のユーザー名 | — |
--auth-pass | Basic認証のパスワード | — |
--no-baseline | ベースライン比較を無効にする | off |
--no-rotate-ua | User-Agentローテーションを無効にする | off |
--waf-header | X-WAF-Tester 識別ヘッダーを送信する | off |
--output | terminal、json、html(カンマ区切り) | all three |
--output-dir | レポートファイルを保存するディレクトリ | . |
--timeout | リクエストごとのタイムアウト(秒) | 10 |
--proxy | 全リクエストのプロキシURL(例:http://127.0.0.1:8080) | off |
--confirm | 許可確認プロンプトをスキップする | off |
| スコア | 評価 | 意味 |
|---|
| 90–100% | A | 優秀 — WAFがほぼすべての攻撃ベクトルをブロック |
| 80–89% | B | 良好 — 調査すべき軽微なギャップあり |
| 65–79% | C | 普通 — 顕著なバイパスベクトルが存在 |
| 50–64% | D | 低い — 保護に重大なギャップあり |
| < 50% | F | 致命的 — WAFはほとんど効果なし |