WebGoat のラボ:自分のコピーで WebWolf と進める、手順つきの Web セキュリティ学習

WebGoat は、手順に沿って進める Web セキュリティのコースです。各レッスンは弱点を説明します。インジェクション、アクセス制御の不備、安全でないデシリアライズ、JWT の誤り、パストラバーサルなどです。そのあと生徒にそれを実際に使わせ、できるとレッスンが完了になります。WebWolf は、第三者の役が必要なレッスンのために、隣で動きます。

対象はすべて生徒自身のラボのコピーの中にあり、コピーはインターネットにも他の生徒にも通じていないため、生徒が攻撃できるのは、ラボが自分のために起動したアプリだけです。決まりはラボの冒頭に示されます。攻撃してよいのは自分のコピーだけで、自分のものでないサイトは決して攻撃しない、というものです。

生徒が学ぶこと

弱点の種類ごとに、説明を横に置いた最初の入門です。暗号、トークン、デシリアライズの基本も含みます。レッスンに何をするかが書かれているので、最初の授業にも、宿題にも向いています。

ブラウザーで動かす

WebGoat は Java アプリケーションで、3つのセキュリティラボの中で最も多い1 GB が割り当てられるため、起動に数秒長くかかります。生徒の進捗は、ラボが動いているあいだ保持されます。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。WebGoatを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. ラボのページには、WebGoat と WebWolf の2つのリンクがあります。WebGoat を開き、Register を選んで、このコピー用のユーザー名とパスワードを決めます。WebWolf は、使うよう書かれたレッスンのためのものです。

何を提出させるか

レッスンごとに、完了になった画面のスクリーンショットを、ラボ自身のアドレスが見える形で提出させます。そしてレッスンごとに、その弱点がなぜ存在し、開発者がどう防ぐかを、自分の言葉で1段落書かせます。後者で、レッスンを理解したのか、クリックして進めただけなのかがわかります。

GitHub のコード

compose ファイルは、WebGoat 自身の公開イメージをバージョンで固定し、小さな nginx の後ろで実行します。nginx は、ラボのリンクを WebGoat のページに送ります。WebGoat は GPL-2.0 ライセンスで、当社が配布するものではありません。

このラボの基本レッスン

WebGoat Basics と WebGoat Basics 2 は、このラボで進める小さなレッスンで、各手順に説明と、生徒のターミナルにコマンドを入力する「実行」ボタンが付いています。どちらも、生徒が攻撃するのは自分のコピーだけというルールから始まります。WebGoat Basics ではターミナルから2つの Web サイトが動いていることを確かめ、登録し、最初のレッスンを開き、WebWolf を訪れます。WebGoat Basics 2 では、ほぼすべての WebGoat レッスンが使う開発者ツールを開き、ターミナルからの応答を確かめます。

無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。どちらも意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、どちらかを自分のモジュールにコピーしてください。

課題として出す

どのレッスンを完了させ、何を提出するかを、課題に書いておきます。

  1. ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-webgoat とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
  2. 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
  3. 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
  4. 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。

よくある質問

WebWolf とは何ですか?
WebGoat に付属する2つ目のアプリケーションで、メッセージを受け取る場所など、生徒以外の第三者が必要なレッスンのためのものです。ラボのページに、それぞれへのリンクがあります。
ラボを止めると進捗は残りますか?
いいえ。生徒のレッスンは、ラボが動いているあいだだけ保持されるので、長いコースは、1回ごとにいくつかのレッスンを完了させる形で、何回かに分けて進めるのがよいでしょう。
WebGoat は宿題に向いていますか?
はい。各レッスンが何をするかを示し、生徒が達成するとレッスンが完了になります。ラボ自身のアドレスが見える完了済みレッスンのスクリーンショットと、弱点がなぜ存在し開発者がどう防ぐかを書いた一段落を求めてください。進捗はラボが動いている間だけ続きます。