
セキュリティテスト用のOWASP Top 10脆弱性を含む脆弱なREST API
脆弱なAPI (OpenAPI 3 ベース)

VAmPIはFlaskで作られた脆弱なAPIであり、API向けのOWASP Top 10の脆弱性を含んでいます。APIのセキュリティ問題を検出するためのツールの効率を評価するために、脆弱なAPIが必要だったことから作成されました。テスト中にAPIを脆弱にするかどうかを切り替えるオン/オフスイッチが含まれています。これにより、偽陽性/偽陰性のケースをより適切にカバーできます。VAmPIは学習/教育目的にも使用できます。脆弱性の詳細については、erev0s.comをご覧ください。
VAmPIのアクションフローは次のとおりです。未登録ユーザーはAPIに含まれるダミーユーザーの最小限の情報を表示できます。ユーザーは登録後、ログインして、ログイン時に受け取ったトークンを使用して本を投稿できるようになります。投稿された本に対して受け付けられるデータは、タイトルとその本に関する秘密です。各本はユーザーごとに一意であり、本の所有者のみが秘密を閲覧できるべきです。
アクションの概要を次の表に示します。
| アクション | パス | 詳細 |
|---|
| GET | /createdb | ダミーデータでデータベースを作成して投入 |
| GET | / | VAmPIホーム |
| GET | /me | ログイン中のユーザーを表示 |
| GET | /users/v1 | すべてのユーザーを基本情報とともに表示 |
| GET | /users/v1/_debug | すべてのユーザーの詳細情報を表示 |
| POST | /users/v1/register | 新しいユーザーを登録 |
| POST | /users/v1/login | VAmPIにログイン |
| GET | /users/v1/{username} | ユーザー名でユーザーを表示 |
| DELETE | /users/v1/{username} | ユーザー名でユーザーを削除(管理者のみ) |
| PUT | /users/v1/{username}/email | 単一ユーザーのメールを更新 |
| PUT | /users/v1/{username}/password | ユーザーのパスワードを更新 |
| GET | /books/v1 | すべての本を取得 |
| POST | /books/v1 | 新しい本を追加 |
| GET | /books/v1/{book} | タイトルと秘密を含む本を取得 |
詳細については、VAmPIを実行して http://127.0.0.1:5000/ui/ にアクセスするか、swagger editor などのサービスを使用して、openapi_specs ディレクトリにあるOpenAPI仕様を提供してください。
これはFlaskアプリケーションなので、実行するにはすべての要件をインストールしてから app.py を実行します。
すべての要件をインストールするには、pip3 install -r requirements.txt を実行し、次に python3 app.py を実行します。
または、DockerやDocker Composeを使用して実行することもできます。
docker run -p 5000:5000 erev0s/vampi:latest
[注意: MacOSの新しいバージョンでDockerを実行する場合、AirPlay Receiverサービスとの競合を避けるために、-p 5001:5000 を使用してください。または、システム環境設定 -> 共有設定でAirPlay Receiverサービスを無効にすることもできます。]
docker-composeには2つのインスタンスが含まれており、一方はポート5001で安全な構成、もう一方はポート5002で不安全な構成です。
docker-compose up -d
APIを実行している場所のパス /ui にアクセスすると、Swagger UIが利用可能になり、開始に役立ちます!
http://127.0.0.1:5000/ui/
ログイン後に作成されるトークンのタイムアウトを変更したい場合、または環境を脆弱でない状態に変更したい場合、アプリケーションの実行方法に応じていくつかの方法があります。
python3 app.py で実行する場合、app.py 自体で定義されている alive 変数と vuln 変数を編集するだけです。alive 変数は秒単位で測定されるため、100 に設定すると、トークンは100秒後に期限切れになります。vuln 変数はブール値のようなもので、1 に設定するとアプリケーションは脆弱になり、0 に設定すると脆弱になりません。docker run コマンドに環境変数を渡すか、Dockerfile を編集して再ビルドする必要があります。
Docker runの例: docker run -d -e vulnerable=0 -e tokentimetolive=300 -p 5000:5000 erev0s/vampi:latest
vulnerable=1 の2番目のコンテナを別のポートで起動し、2つの間を簡単に切り替えられることです。Dockerfileには、ENV vulnerable=1 と ENV tokentimetolive=60 の2つの環境変数が設定されています。docker buildコマンドを実行する前に自由に変更してください。
/createdb エンドポイントにリクエストを送信してください。