コンテンツにスキップ

アプリケーション

各アプリケーションは、nginx リバースプロキシを経由して VM 上でアクセス可能な nginx アップストリームプールの背後で、4 つの負荷分散された Docker コンテナとして実行されます。スティッキーセッションにより、ステートフルなアプリケーション(Juice Shop、DVWA、VAmPI、CSD Demo)が一貫してルーティングされます。すべてのアプリケーションは意図的に脆弱であり、セキュリティテスト用に設計されています。

以下のすべての例では、<ORIGIN>http://<PUBLIC_IP> に置き換えてください。Terraform 経由でデプロイした後、terraform output -raw public_ip で IP アドレスを取得してください。

クイックリファレンス — 全 URL パス

Section titled “クイックリファレンス — 全 URL パス”
パスアプリケーションHTTP メソッド期待されるレスポンス
/ランディングページGET200 HTML(全アプリへのリンクあり)
/healthヘルスチェックGET200 JSON {"status":"healthy","component":"origin-server",...}
/juice-shop/Juice ShopGET200 HTML(Angular SPA、約 75 KB)
/juice-shop/rest/products/search?q=Juice Shop APIGET200 JSON {"status":"success","data":[...]} (36 製品)
/dvwa/DVWAGET302 リダイレクト(/dvwa/login.php へ)
/dvwa/login.phpDVWA ログインGET200 HTML ログインフォーム
/dvwa/setup.phpDVWA セットアップGET200 HTML(初回データベース初期化)
/vampi/VAmPIGET200 HTML(API ドキュメント)
/vampi/users/v1VAmPI APIGET200 JSON {"users":[...]}
/vampi/users/v1/registerVAmPI APIPOST200 JSON {"status":"success",...}
/vampi/users/v1/loginVAmPI APIPOST200 JSON {"auth_token":"...","status":"success"}
/httpbin/gethttpbinGET200 JSON(リクエスト詳細)
/httpbin/posthttpbinPOST200 JSON(POST データ)
/httpbin/headershttpbinGET200 JSON {"headers":{...}}
/httpbin/status/:codehttpbinGET指定された HTTP ステータスコードを返す
/whoami/whoamiGET200 プレーンテキスト(ホスト名、IP、全ヘッダー)
/csd-demo/CSD DemoGET200 HTML チェックアウトフォーム(攻撃パネル付き)
/csd-demo/dashboardCSD 攻撃者ビューGET200 HTML(流出データを表示)
/csd-demo/healthCSD ヘルスGET200 JSON {"status":"healthy","component":"csd-demo",...}
/csd-demo/exfil/logCSD 流出ログGET200 JSON(キャプチャデータの配列)
/dvga/DVGA GraphiQLGET200 HTML(GraphiQL IDE)
/dvga/graphqlDVGA GraphQL APIPOST200 JSON GraphQL レスポンス
/restaurant/RESTaurantGET200(ドキュメントへリダイレクト)
/restaurant/docsRESTaurant SwaggerGET200 HTML(FastAPI Swagger UI)
/restaurant/openapi.jsonRESTaurant OpenAPIGET200 JSON OpenAPI 仕様
http://<PUBLIC_IP>:8888crAPIGET200 HTML(SPA)
http://<PUBLIC_IP>:8888/identity/api/auth/signupcrAPI サインアップPOST200 JSON
http://<PUBLIC_IP>:8888/identity/api/auth/logincrAPI ログインPOST200 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--
リフレクト XSSWeb アプリファイアウォール (WAF)、クライアントサイド防御検索パラメーターを介したスクリプトインジェクション
DOM ベース XSSクライアントサイド防御URL フラグメントへのペイロード
認証の不備Web アプリファイアウォール (WAF)ブルートフォースログイン、JWT 操作
API 悪用API セキュリティ/api/ エンドポイントへの不正アクセス
機密データの漏洩API セキュリティ認証なしによるユーザーデータへのアクセス
CSRFWeb アプリファイアウォール (WAF)プロフィール変更に対するクロスサイトリクエストフォージェリ
Terminal window
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 は初回デプロイ後に一度だけデータベースのセットアップが必要です。

  1. http://<PUBLIC_IP>/dvwa/setup.php に移動する
  2. Create / Reset Database をクリックする
  3. 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)API1ID を操作して他のユーザーのデータにアクセス
認証の不備API2脆弱なトークン処理、レートリミットなし
過剰なデータ露出API3API がクライアントに必要以上のデータを返す
Mass AssignmentAPI6予期しないパラメーターを通じて管理者フィールドを変更
SQL インジェクションAPI8API パラメーターを通じたインジェクション
不適切なアセット管理API9ドキュメント化されていない API エンドポイント
Terminal window
# 新しいユーザーを登録する
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リクエストで渡されたすべての情報を返す
Terminal window
# オリジンが受信するヘッダーを確認する(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-ForTrue-Client-IPX-Volterra-* ヘッダー
クライアント IP の可視性確認X-Real-IPRemoteAddr の比較
WAF 誤検知のデバッグF5 XC 適用前後のリクエストヘッダーの比較
Bot 防御タグの検証X-Volterra-Bot-TypeX-Volterra-Bot-Verified ヘッダー
TLS 終端の確認X-Forwarded-Proto が F5 XC で TLS 終端時に https を示す
Terminal window
# 基本リクエスト -- オリジンが受信した内容を確認する
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"

出力例:

Hostname: 534c5084e169
IP: 127.0.0.1
RemoteAddr: 172.17.0.1:55118
GET / HTTP/1.1
Host: 20.12.78.159
User-Agent: curl/8.5.0
Accept: */*
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Forwarded-Proto: https
X-Real-Ip: 104.219.105.84

DVGA(Damn Vulnerable GraphQL Application)

Section titled “DVGA(Damn Vulnerable GraphQL Application)”
パス/dvga/
イメージdolevf/dvga:latest
インスタンス数4(ポート 5201〜5204)、ip_hash によるスティッキー(インスタンスごとに SQLite)
リソースインスタンスあたり 0.5 CPU / 256 MiB RAM
フレームワークPython / Flask / GraphQL
プロジェクトgithub.com/dolevf/Damn-Vulnerable-GraphQL-Application

DVGA は GraphQL 固有の脆弱性テスト専用に構築されています。インタラクティブなクエリ探索のために /dvga/ に GraphiQL IDE を、GraphQL API エンドポイントとして /dvga/graphql を提供します。各インスタンスは独自の SQLite データベースを使用するため、ip_hash スティッキーセッションにより一貫した状態が保証されます。

シナリオカテゴリ攻撃ベクトル
GraphQL インジェクションAPI セキュリティ文字列補間を介した悪意のあるクエリ
サービス妨害(DoS)API セキュリティ深くネストされたクエリ、バッチクエリ、リソース枯渇
認証バイパスAPI セキュリティGraphQL を通じた未承認データへのアクセス
情報開示API セキュリティスキーマの詳細を明らかにするイントロスペクションクエリ
バッチ攻撃API セキュリティ単一リクエストに複数の操作を含める
Terminal window
# 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(Damn Vulnerable RESTaurant API Game)

Section titled “RESTaurant(Damn Vulnerable RESTaurant API Game)”
パス/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)API1ID を操作して他のユーザーの注文にアクセス
認証の不備API2脆弱なトークン処理、クレデンシャルスタッフィング
Broken Object Property Level AuthorizationAPI3ユーザープロフィールフィールドへの Mass Assignment
無制限のリソース消費API4エンドポイントにレートリミットなし
Broken Function Level Authorization(BFLA)API5一般ユーザーとして管理者エンドポイントにアクセス
Server Side Request Forgery(SSRF)API7サーバーサイドの URL リクエストを操作
セキュリティの設定ミスAPI8詳細なエラーメッセージ、デフォルト認証情報
Terminal window
# Swagger UI
curl -sf "http://<PUBLIC_IP>/restaurant/docs" -o /dev/null -w "%{http_code}"
# OpenAPI 仕様
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"

crAPI(OWASP Completely Ridiculous API)

Section titled “crAPI(OWASP Completely Ridiculous API)”
ポート8888(専用 — パスプレフィックスなし)
イメージcrapi/crapi-webcrapi/crapi-identitycrapi/crapi-communitycrapi/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 AssignmentAPI を通じた保護フィールド(ロール、残高)の変更
SSRF(Server Side Request Forgery)サーバーサイドの URL フェッチの操作
JWT 操作権限昇格のための JWT トークンの偽造または変更
NoSQL インジェクションMongoDB バックエンドエンドポイントへのクエリインジェクション
過剰なデータ露出API が機密ユーザーデータを返す
Terminal window
# crAPI が実行中であることを確認する
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-mongo (MongoDB)
-> crapi-mailhog (email capture, port 18025)

アプリケーションカバレッジマトリクス

Section titled “アプリケーションカバレッジマトリクス”
デモユースケース主要アプリサブアプリ
Web アプリファイアウォール (WAF) — SQL インジェクションDVWAJuice Shop
Web アプリファイアウォール (WAF) — XSSDVWAJuice Shop
Web アプリファイアウォール (WAF) — コマンドインジェクションDVWA
API セキュリティ — BOLAVAmPI
API セキュリティ — 認証バイパスVAmPIJuice Shop
API セキュリティ — データ露出VAmPIhttpbin
Bot 標準防御 — ブルートフォースDVWAJuice Shop
Bot 標準防御 — スクレイピングJuice Shop
クライアントサイド防御 — DOM XSSJuice Shop
クライアントサイド防御 — ストアド XSSDVWAJuice Shop
クライアントサイド防御 — カードスキマーCSD Demo
クライアントサイド防御 — フォームジャッキングCSD Demo
クライアントサイド防御 — キーロガーCSD Demo
クライアントサイド防御 — クリプトマイナーCSD Demo
クライアントサイド防御 — DOM ハイジャックCSD Demo
API セキュリティ — GraphQL インジェクションDVGA
API セキュリティ — GraphQL DoSDVGA
API セキュリティ — OWASP API Top 10 2023RESTaurantcrAPI
API セキュリティ — BFLARESTaurantcrAPI
API セキュリティ — Mass AssignmentcrAPIRESTaurant
API セキュリティ — SSRFcrAPIRESTaurant
API セキュリティ — JWT 操作crAPI
API セキュリティ — NoSQL インジェクションcrAPI
基本的な接続性テストhttpbin
リクエスト診断whoamihttpbin
ヘッダーインジェクションの確認whoami