各アプリケーションは、nginx リバースプロキシを経由して VM 上でアクセス可能な nginx アップストリームプールの背後で、4 つの負荷分散された Docker コンテナとして実行されます。スティッキーセッションにより、ステートフルなアプリケーション(Juice Shop、DVWA、VAmPI、CSD Demo)が一貫してルーティングされます。すべてのアプリケーションは意図的に脆弱であり、セキュリティテスト用に設計されています。
以下のすべての例では、<ORIGIN> を http://<PUBLIC_IP> に置き換えてください。Terraform 経由でデプロイした後、terraform output -raw public_ip で IP アドレスを取得してください。
パス アプリケーション HTTP メソッド 期待されるレスポンス /ランディングページ GET 200 HTML(全アプリへのリンクあり) /healthヘルスチェック GET 200 JSON {"status":"healthy","component":"origin-server",...} /juice-shop/Juice Shop GET 200 HTML(Angular SPA、約 75 KB) /juice-shop/rest/products/search?q=Juice Shop API GET 200 JSON {"status":"success","data":[...]} (36 製品) /dvwa/DVWA GET 302 リダイレクト(/dvwa/login.php へ) /dvwa/login.phpDVWA ログイン GET 200 HTML ログインフォーム /dvwa/setup.phpDVWA セットアップ GET 200 HTML(初回データベース初期化) /vampi/VAmPI GET 200 HTML(API ドキュメント) /vampi/users/v1VAmPI API GET 200 JSON {"users":[...]} /vampi/users/v1/registerVAmPI API POST 200 JSON {"status":"success",...} /vampi/users/v1/loginVAmPI API POST 200 JSON {"auth_token":"...","status":"success"} /httpbin/gethttpbin GET 200 JSON(リクエスト詳細) /httpbin/posthttpbin POST 200 JSON(POST データ) /httpbin/headershttpbin GET 200 JSON {"headers":{...}} /httpbin/status/:codehttpbin GET 指定された HTTP ステータスコードを返す /whoami/whoami GET 200 プレーンテキスト(ホスト名、IP、全ヘッダー) /csd-demo/CSD Demo GET 200 HTML チェックアウトフォーム(攻撃パネル付き) /csd-demo/dashboardCSD 攻撃者ビュー GET 200 HTML(流出データを表示) /csd-demo/healthCSD ヘルス GET 200 JSON {"status":"healthy","component":"csd-demo",...} /csd-demo/exfil/logCSD 流出ログ GET 200 JSON(キャプチャデータの配列) /dvga/DVGA GraphiQL GET 200 HTML(GraphiQL IDE) /dvga/graphqlDVGA GraphQL API POST 200 JSON GraphQL レスポンス /restaurant/RESTaurant GET 200(ドキュメントへリダイレクト) /restaurant/docsRESTaurant Swagger GET 200 HTML(FastAPI Swagger UI) /restaurant/openapi.jsonRESTaurant OpenAPI GET 200 JSON OpenAPI 仕様 http://<PUBLIC_IP>:8888crAPI GET 200 HTML(SPA) http://<PUBLIC_IP>:8888/identity/api/auth/signupcrAPI サインアップ POST 200 JSON http://<PUBLIC_IP>:8888/identity/api/auth/logincrAPI ログイン POST 200 JSON {"token":"..."}
パス /juice-shop/イメージ bkimminich/juice-shop:latestインスタンス数 4(ポート 3001〜3004)、hash $cookie_token によるスティッキー、プロキシキャッシュ(TTL 60 秒) リソース インスタンスあたり 2 CPU / 1 GiB RAM フレームワーク Node.js / Angular プロジェクト owasp.org/www-project-juice-shop
OWASP Juice Shop は、最もモダンで積極的にメンテナンスされている脆弱な Web アプリケーションです。現実的な EC アプリケーションの形で、OWASP Top 10 全体を 100 以上のチャレンジでカバーしています。
シナリオ カテゴリ 攻撃ベクトル SQL インジェクションによるログインバイパス Web アプリファイアウォール (WAF) ログインメールフィールドへの ' OR 1=1-- リフレクト XSS Web アプリファイアウォール (WAF)、クライアントサイド防御 検索パラメーターを介したスクリプトインジェクション DOM ベース XSS クライアントサイド防御 URL フラグメントへのペイロード 認証の不備 Web アプリファイアウォール (WAF) ブルートフォースログイン、JWT 操作 API 悪用 API セキュリティ /api/ エンドポイントへの不正アクセス機密データの漏洩 API セキュリティ 認証なしによるユーザーデータへのアクセス CSRF Web アプリファイアウォール (WAF) プロフィール変更に対するクロスサイトリクエストフォージェリ
curl -s " http://<PUBLIC_IP>/juice-shop/ " -o /dev/null -w " %{http_code} "
パス /dvwa/イメージ カスタム dvwa-fpm:latest(php-fpm + nginx、ghcr.io/digininja/dvwa:latest からビルド) インスタンス数 4(ポート 8101〜8104)、hash $cookie_PHPSESSID によるスティッキー リソース インスタンスあたり 0.5 CPU / 256 MiB RAM データベース 共有 MariaDB 10.11(dvwa-db コンテナ、1 CPU / 768 MiB) フレームワーク PHP 8 / php-fpm / MariaDB 認証情報 admin / password
DVWA は WAF テストの業界標準です。セキュリティレベル(Low、Medium、High、Impossible)を調整でき、段階的に入力バリデーションと出力エンコーディングが強化されます。
シナリオ カテゴリ セキュリティレベル SQL インジェクション Web アプリファイアウォール (WAF) Low: 簡単な ' OR 1=1#、High: ブラインド SQLi コマンドインジェクション Web アプリファイアウォール (WAF) Low: ; ls、High: フィルタリングされた文字 ファイルインクルージョン Web アプリファイアウォール (WAF) Low: 直接パストラバーサル、High: サニタイズ済み XSS(リフレクト) Web アプリファイアウォール (WAF)、クライアントサイド防御 Low: 基本的な <script>、High: エンコードによるバイパス XSS(ストアド) Web アプリファイアウォール (WAF)、クライアントサイド防御 Low: ゲストブックへの永続的スクリプト ファイルアップロード Web アプリファイアウォール (WAF) Low: PHP シェルのアップロード、High: 拡張子フィルタリング ブルートフォース Bot 標準防御 自動化されたログイン試行
ログイン後、/dvwa/security.php でセキュリティレベルを設定します。
Low — 入力バリデーションなし。あらゆる攻撃が成功します。WAF シグネチャのデモに最適です。
Medium — 基本的なフィルタリング。一部の攻撃にはエンコーディングやバイパス技術が必要です。
High — 強力なフィルタリング。高度な技術のみが成功します。WAF の限界を示すのに最適です。
Impossible — 完全にセキュアな実装。適切な防御的コーディングを示します。
DVWA は初回デプロイ後に一度だけデータベースのセットアップが必要です。
http://<PUBLIC_IP>/dvwa/setup.php に移動する
Create / Reset Database をクリックする
admin / password でログインする
パス /vampi/イメージ gunicorn エントリポイント付き erev0s/vampi:latest(4 ワーカー) インスタンス数 4(ポート 5101〜5104)、ip_hash によるスティッキー(インスタンスごとに SQLite) リソース インスタンスあたり 0.5 CPU / 512 MiB RAM フレームワーク Python / Flask / gunicorn プロジェクト github.com/erev0s/VAmPI
VAmPI は OWASP API セキュリティ Top 10 のテスト専用に構築されています。意図的な脆弱性を持つ現実的な REST API を提供します。各インスタンスは 4 ワーカーの gunicorn と独自の SQLite データベースで実行されます。ip_hash スティッキーセッションにより、同じクライアント IP からの登録とログインは常に同じインスタンスにルーティングされます。
シナリオ OWASP API Top 10 手法 Broken Object Level Authorization(BOLA) API1 ID を操作して他のユーザーのデータにアクセス 認証の不備 API2 脆弱なトークン処理、レートリミットなし 過剰なデータ露出 API3 API がクライアントに必要以上のデータを返す Mass Assignment API6 予期しないパラメーターを通じて管理者フィールドを変更 SQL インジェクション API8 API パラメーターを通じたインジェクション 不適切なアセット管理 API9 ドキュメント化されていない API エンドポイント
curl -X POST " http://<PUBLIC_IP>/vampi/users/v1/register " \
-H " Content-Type: application/json " \
-d ' {"username":"test","password":"test123","email":"test@test.com"} '
curl -X POST " http://<PUBLIC_IP>/vampi/users/v1/login " \
-H " Content-Type: application/json " \
-d ' {"username":"test","password":"test123"} '
curl " http://<PUBLIC_IP>/vampi/users/v1 "
パス /httpbin/イメージ gunicorn CMD オーバーライド付き kennethreitz/httpbin:latest(-w 4 -k gevent --timeout 30) インスタンス数 4(ポート 8201〜8204)、ラウンドロビン(ステートレス) リソース インスタンスあたり 0.5 CPU / 256 MiB RAM フレームワーク Python / Flask / gunicorn + gevent プロジェクト httpbin.org
httpbin は、基本的な API デモ、リクエストヘッダーのテスト、およびプロキシ動作の確認に役立つシンプルな HTTP リクエスト/レスポンスサービスです。
エンドポイント 目的 /httpbin/getGET リクエストデータを返す(ヘッダー、引数、オリジン) /httpbin/postPOST リクエストデータを返す(ボディ、フォーム、JSON) /httpbin/headersリクエストヘッダーを返す /httpbin/ipオリジン IP を返す /httpbin/user-agentUser-Agent ヘッダーを返す /httpbin/status/:code指定された HTTP ステータスコードを返す /httpbin/delay/:secondsレスポンスを N 秒遅延させる /httpbin/anythingリクエストで渡されたすべての情報を返す
# オリジンが受信するヘッダーを確認する(F5 XC ヘッダーインジェクションの検証に有用)
curl -s " http://<PUBLIC_IP>/httpbin/headers " | jq .
# 特定の HTTP ステータスコードをテストする
curl -s -o /dev/null -w " %{http_code} " " http://<PUBLIC_IP>/httpbin/status/403 "
パス /whoami/イメージ traefik/whoami:latestインスタンス数 4(ポート 8082〜8085)、ラウンドロビン(ステートレス) リソース インスタンスあたり 0.25 CPU / 64 MiB RAM フレームワーク Go プロジェクト github.com/traefik/whoami
whoami は Traefik の軽量なリクエストエコーサーバーです。オリジンが受信した HTTP リクエストのすべての詳細(ホスト名、IP アドレス、全ヘッダー、メソッド、URL)を表示します。F5 XC が正しいヘッダーをインジェクトしていることを確認する際に、最も重要な診断ツールです。
ユースケース 確認ポイント F5 XC ヘッダーインジェクションの確認 X-Forwarded-For、True-Client-IP、X-Volterra-* ヘッダークライアント IP の可視性確認 X-Real-IP と RemoteAddr の比較WAF 誤検知のデバッグ F5 XC 適用前後のリクエストヘッダーの比較 Bot 防御タグの検証 X-Volterra-Bot-Type、X-Volterra-Bot-Verified ヘッダーTLS 終端の確認 X-Forwarded-Proto が F5 XC で TLS 終端時に https を示す
# 基本リクエスト -- オリジンが受信した内容を確認する
curl " http://<PUBLIC_IP>/whoami/ "
# F5 XC 経由のリクエストをシミュレートする(インジェクトされたヘッダー付き)
curl " http://<PUBLIC_IP>/whoami/ " \
-H " X-Forwarded-For: 203.0.113.50 " \
-H " True-Client-IP: 203.0.113.50 " \
-H " X-Forwarded-Proto: https "
出力例:
RemoteAddr: 172.17.0.1:55118
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Real-Ip: 104.219.105.84
DVGA は GraphQL 固有の脆弱性テスト専用に構築されています。インタラクティブなクエリ探索のために /dvga/ に GraphiQL IDE を、GraphQL API エンドポイントとして /dvga/graphql を提供します。各インスタンスは独自の SQLite データベースを使用するため、ip_hash スティッキーセッションにより一貫した状態が保証されます。
シナリオ カテゴリ 攻撃ベクトル GraphQL インジェクション API セキュリティ 文字列補間を介した悪意のあるクエリ サービス妨害(DoS) API セキュリティ 深くネストされたクエリ、バッチクエリ、リソース枯渇 認証バイパス API セキュリティ GraphQL を通じた未承認データへのアクセス 情報開示 API セキュリティ スキーマの詳細を明らかにするイントロスペクションクエリ バッチ攻撃 API セキュリティ 単一リクエストに複数の操作を含める
# GraphiQL UI(インタラクティブ IDE)
curl -sf " http://<PUBLIC_IP>/dvga/ " -o /dev/null -w " %{http_code} "
# イントロスペクションクエリ -- 完全なスキーマを列挙する
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ __schema { types { name fields { name } } } }"} '
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ pastes { title content } }"} '
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"mutation { createPaste(title:\"test\", content:\"hello\", public:true) { paste { title } } }"} '
パス /restaurant/イメージ theowni/Damn-Vulnerable-RESTaurant-API-Game からのカスタムビルドインスタンス数 4(ポート 8301〜8304)、ラウンドロビン(共有 PostgreSQL) リソース インスタンスあたり 0.5 CPU / 256 MiB RAM データベース 共有 PostgreSQL 15.4(restaurant-db コンテナ、0.5 CPU / 512 MiB) フレームワーク Python / FastAPI / PostgreSQL 認証情報 admin / password(PostgreSQL)プロジェクト github.com/theowni/Damn-Vulnerable-RESTaurant-API-Game
RESTaurant は OWASP API セキュリティ Top 10 2023 をカバーするゲーム形式の脆弱な REST API です。FastAPI を使用しており、/restaurant/docs に自動生成された Swagger UI ドキュメントが提供されます。4 つのインスタンスすべてが単一の PostgreSQL データベースを共有しているため、スティッキーセッションなしでラウンドロビン負荷分散が機能します。
シナリオ OWASP API Top 10 2023 手法 Broken Object Level Authorization(BOLA) API1 ID を操作して他のユーザーの注文にアクセス 認証の不備 API2 脆弱なトークン処理、クレデンシャルスタッフィング Broken Object Property Level Authorization API3 ユーザープロフィールフィールドへの Mass Assignment 無制限のリソース消費 API4 エンドポイントにレートリミットなし Broken Function Level Authorization(BFLA) API5 一般ユーザーとして管理者エンドポイントにアクセス Server Side Request Forgery(SSRF) API7 サーバーサイドの URL リクエストを操作 セキュリティの設定ミス API8 詳細なエラーメッセージ、デフォルト認証情報
curl -sf " http://<PUBLIC_IP>/restaurant/docs " -o /dev/null -w " %{http_code} "
curl -s " http://<PUBLIC_IP>/restaurant/openapi.json " | jq .info
# BOLA -- 認証後に他のユーザーの注文にアクセス
curl -s " http://<PUBLIC_IP>/restaurant/orders/1 " \
-H " Authorization: Bearer <token> "
# BFLA -- 一般ユーザーとして管理者アクションを試みる
curl -s -X POST " http://<PUBLIC_IP>/restaurant/admin/users " \
-H " Authorization: Bearer <user_token> " \
-H " Content-Type: application/json "
ポート 8888(専用 — パスプレフィックスなし)イメージ crapi/crapi-web、crapi/crapi-identity、crapi/crapi-community、crapi/crapi-workshop、PostgreSQL、MongoDB、MailHogインスタンス数 7 マイクロサービス(各 1 インスタンス) リソース 合計 約 3.0 CPU / 約 2.0 GiB RAM フレームワーク React SPA + Java/Go/Python マイクロサービス プロジェクト github.com/OWASP/crAPI
crAPI は API セキュリティテストのための OWASP フラッグシッププロジェクトです。React SPA が API パスをハードコードしており、パスプレフィックスの背後でサービスを提供できないため、専用ポート(8888)で 7 つのマイクロサービスとして実行されます。NSG はポート 8888 へのインバウンドトラフィックを許可しています。
MailHog は crAPI が送信するすべてのメール(アカウント確認、パスワードリセット)をキャプチャします。MailHog へは SSH トンネル経由でポート 18025 からアクセスします。
カテゴリ 脆弱性 BOLA(Broken Object Level Authorization) 他のユーザーの車両、注文、レポートへのアクセス BFLA(Broken Function Level Authorization) 管理者への昇格、制限されたエンドポイントへのアクセス Mass Assignment API を通じた保護フィールド(ロール、残高)の変更 SSRF(Server Side Request Forgery) サーバーサイドの URL フェッチの操作 JWT 操作 権限昇格のための JWT トークンの偽造または変更 NoSQL インジェクション MongoDB バックエンドエンドポイントへのクエリインジェクション 過剰なデータ露出 API が機密ユーザーデータを返す
curl -sf " http://<PUBLIC_IP>:8888 " -o /dev/null -w " %{http_code} "
curl -s -X POST " http://<PUBLIC_IP>:8888/identity/api/auth/signup " \
-H " Content-Type: application/json " \
-d ' {"name":"Test User","email":"test@example.com","number":"1234567890","password":"Test1234!"} '
curl -s -X POST " http://<PUBLIC_IP>:8888/identity/api/auth/login " \
-H " Content-Type: application/json " \
-d ' {"email":"test@example.com","password":"Test1234!"} '
# MailHog へのアクセス(メール確認用の SSH トンネル経由)
# ssh -L 18025:localhost:18025 azureuser@<PUBLIC_IP>
# その後、ブラウザで http://localhost:18025 を開く
Port 8888 -> crapi-web (React SPA + nginx)
-> crapi-identity (Java, user auth, JWT)
-> crapi-community (Go, forums, posts)
-> crapi-workshop (Python, vehicle service)
-> crapi-postgres (PostgreSQL)
-> crapi-mailhog (email capture, port 18025)
デモユースケース 主要アプリ サブアプリ Web アプリファイアウォール (WAF) — SQL インジェクション DVWA Juice Shop Web アプリファイアウォール (WAF) — XSS DVWA Juice Shop Web アプリファイアウォール (WAF) — コマンドインジェクション DVWA — API セキュリティ — BOLA VAmPI — API セキュリティ — 認証バイパス VAmPI Juice Shop API セキュリティ — データ露出 VAmPI httpbin Bot 標準防御 — ブルートフォース DVWA Juice Shop Bot 標準防御 — スクレイピング Juice Shop — クライアントサイド防御 — DOM XSS Juice Shop — クライアントサイド防御 — ストアド XSS DVWA Juice Shop クライアントサイド防御 — カードスキマー CSD Demo — クライアントサイド防御 — フォームジャッキング CSD Demo — クライアントサイド防御 — キーロガー CSD Demo — クライアントサイド防御 — クリプトマイナー CSD Demo — クライアントサイド防御 — DOM ハイジャック CSD Demo — API セキュリティ — GraphQL インジェクション DVGA — API セキュリティ — GraphQL DoS DVGA — API セキュリティ — OWASP API Top 10 2023 RESTaurant crAPI API セキュリティ — BFLA RESTaurant crAPI API セキュリティ — Mass Assignment crAPI RESTaurant API セキュリティ — SSRF crAPI RESTaurant API セキュリティ — JWT 操作 crAPI — API セキュリティ — NoSQL インジェクション crAPI — 基本的な接続性テスト httpbin — リクエスト診断 whoami httpbin ヘッダーインジェクションの確認 whoami —