Web、API、LLMを対象としたアプリケーションセキュリティテスト、セキュアコードレビュー、CI/CDパイプラインへのセキュリティ実装を練習するための、意図的に脆弱なWebアプリケーションです。
⚠️ 警告:このアプリケーションは意図的に脆弱性を含んでおり、教育目的でのみ隔離された環境で使用してください。

このプロジェクトは、複数のセキュリティ脆弱性を組み込んだシンプルなバンキングアプリケーションです。セキュリティエンジニア、開発者、インターン、QAアナリスト、DevSecOps実践者が以下について学ぶために設計されています:
USD、GBP、NGN、JPY、EUR、QAR、BTC、ETH)
認証と認可
データセキュリティ
取引の脆弱性
ファイル操作
セッション管理
クライアントおよびサーバーサイドの欠陥
バーチャルカードの脆弱性
請求書支払いの脆弱性
マーチャント決済APIの脆弱性
git clone https://github.com/Commando-X/vuln-bank.git
cd vuln-bank
docker-compose up -d --build
アプリケーションは http://localhost:5000 で利用可能になります。
Dockerセットアップには、手動のSSH介入なしでアプリが復旧できるようにするための運用上のセーフガードがいくつか含まれています:
web と db は restart: unless-stopped を使用するため、プロセスが終了した場合にDockerが自動的に再起動します。db はヘルスチェックを公開し、web は起動前にPostgresの準備完了を待ちます。web は debug=True でFlask開発サーバーを実行します(意図的。Werkzeugデバッガーを対象としたトレーニングシナリオを維持するため)。web は GET /healthz を公開し、コンテナがアプリとデータベースが実際に使用可能かどうかを報告できるようにします。これにより、意図的に脆弱なアプリケーションの動作を維持しながら、コンテナのライフサイクルをより堅牢にします。
実際のコンテナを起動せずに、ローカルのランタイム構成を検証できます:
python3 -m unittest discover -s tests -v
これにより /healthz エンドポイントの動作をチェックし、start.sh がデータベースを待ってからFlaskアプリを起動することを検証します。
現在のPython環境にFlaskアプリの依存関係がインストールされていない場合は、/healthz ルートのテストはスキップされ、起動スクリプトのスモークテストは引き続き実行されます。
git clone https://github.com/Commando-X/vuln-bank.git
cd vuln-bank
docker build -t vuln-bank .
docker run -p 5000:5000 vuln-bank
git clone https://github.com/Commando-X/vuln-bank.git
cd vuln-bank
# Windowsの場合
python -m venv venv
venv\Scripts\activate
# Linux/Macの場合
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Windowsの場合
mkdir static\uploads
# Linux/Macの場合
mkdir -p static/uploads
.envファイルを変更します:
アプリケーションを実行します:
# Windowsの場合
python app.py
# Linux/Macの場合
python3 app.py
.env ファイルは、教育目的での簡単なセットアップを促進するために、このリポジトリに意図的に含まれています。実際のアプリケーションでは、.env ファイルをバージョン管理にコミットしてはいけません。
現在の環境変数:
DB_NAME=vulnerable_bank
DB_USER=postgres
DB_PASSWORD=postgres
DB_HOST=db # ローカルインストールの場合は 'localhost' に変更
DB_PORT=5432
このアプリケーションはPostgreSQLを使用します。アプリケーションを初めて実行するとデータベースが自動的に初期化され、以下を作成します:
http://localhost:5000http://localhost:5000/api/docshttp://localhost:5000/graphql"python not found" エラーが発生する場合:
python の代わりに py を使用してみてくださいuploadsフォルダの権限の問題:
ディレクトリ作成時にPermission deniedエラーが発生する場合:
sudo mkdir -p static/uploads
sudo chown -R $USER:$USER static/uploads
ポート5000がすでに使用されている場合:
# ポート5000を使用しているプロセスを終了
sudo lsof -i:5000
sudo kill <PID>
接続が拒否された場合:
.env ファイルの認証情報を確認してください認証に失敗した場合:
.env の DB_PASSWORD がPostgresユーザーのパスワードと一致していることを確認してください。
または、postgres ユーザーを次のコマンドでリセットします:
ALTER ROLE postgres WITH PASSWORD 'your_password';
インストールエラーが発生した場合:
PostgreSQLのエラーが発生した場合は、Chocolateyでインストールし、パスワードを postgres に設定します:
choco install postgresql --version=17.4.0 -y
# 生成されたパスワードを使用するか、すぐにリセットします:
& 'C:\Program Files\PostgreSQL\17\bin\psql.exe' -U postgres -c "ALTER ROLE postgres WITH PASSWORD 'postgres';"
データベースが存在しない場合:
手動で作成します:
CREATE DATABASE vulnerable_bank;
または、次のコマンドを実行します:
createdb -U postgres -h localhost vulnerable_bank
/upload_profile_picture_url を使用
http://127.0.0.1:5000/internal/secrethttp://127.0.0.1:5000/internal/config.jsonhttp://127.0.0.1:5000/latest/meta-data/ (および .../iam/security-credentials/ などのサブパス)https://webhook.site/<your-id> に指定し、着信リクエストを観察curl -s -X POST http://localhost:5000/upload_profile_picture_url \
-H "Authorization: Bearer <JWT>" \
-H "Content-Type: application/json" \
-d '{"image_url":"http://127.0.0.1:5000/internal/secret"}'
# -> 返された file_path をコピーして http://localhost:5000/<file_path> にGETリクエストします
/graphql に対してスキーマイントロスペクションを実行accountNumber などのGraphQLリゾルバ入力を通じてSQLインジェクションをテスト/api/virtual-cards/<card_id>/fund の exchange_rate を操作して、USD換算中にカードへ過剰にチャージ公開マーチャントAPIを使用すると、eコマースラボなどの意図的に脆弱なデモアプリが、Vulnbankバーチャルカードからの支払いを受け付けることができます。
通常のVulnbankユーザーとして登録またはログインします。
バーチャルカードを作成し、ユーザーのメイン残高からチャージします。
http://localhost:5000/merchant/register またはAPIからマーチャント統合を登録します:
curl -s -X POST http://localhost:5000/api/v1/merchants/register \
-H "Content-Type: application/json" \
-d '{"name":"Demo Ecommerce","email":"[email protected]","password":"password123"}'
マーチャントAPIキーを使用して、eコマースアプリからユーザーのVulnbankカードに請求します:
curl -s -X POST http://localhost:5000/api/v1/payments/charge \
-H "X-Merchant-Api-Key: <MERCHANT_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"amount": 49.99,
"currency": "USD",
"card_number": "4111111111111111",
"cvv": "123",
"expiry_date": "12/28",
"merchant_order_id": "ORDER-1001",
"description": "Demo ecommerce checkout"
}'
http://localhost:5000/merchant/dashboard でマーチャントダッシュボードを表示するか、APIキーまたは脆弱なマーチャントJWTのいずれかを使用して支払い詳細を取得します:
curl -s http://localhost:5000/api/v1/payments/<payment_id> \
-H "Authorization: Bearer <MERCHANT_JWT>"
/api/v1/payments/merchant_id/<merchant_id> を通じて別のマーチャントの支払い履歴を取得する/api/v1/payments と /api/v1/payments/merchant_id/<merchant_id> を比較するAIチャットへのアクセス: ダッシュボードの右下隅にある青いチャットバブルを探します
注記: チャットウィジェットには2つのモードがあります:
AI技術: 実際のLLM脆弱性にはDeepSeek APIを使用し、APIキーが設定されていない場合はモックにフォールバックします。
プロンプトインジェクション攻撃
AIを介した情報開示
AIによる認可バイパス
AIシステムの悪用
コンテキストインジェクションとモードテスト
実際のプロンプトインジェクション手法
コントリビューションを歓迎します!お気軽にどうぞ:
このラボと私の調査結果に関する詳細なウォークスルーはこちら:
👇 DghostNinja によるブログを読む
(https://dghostninja.github.io/posts/Vulnerable-Bank-API/)
👇 CyberPreacher による詳細なウォークスルー
(https://medium.com/@cyberpreacher_/hacking-vulnerable-bank-api-extensive-d2a0d3bb209e)
倫理的なハッキングのみ。スコープ尊重。コーヒー消費済み。☕
このアプリケーションには教育目的のための意図的なセキュリティ脆弱性が含まれています。以下を行わないでください:
このプロジェクトはMITライセンスの下でライセンスされています - 詳細はLICENSEファイルを参照してください。
セキュリティ教育のために ❤️ を込めて作られました
AIカスタマーサポートの脆弱性
GraphQLの脆弱性
/graphql に継承される脆弱なJWTベース認証