OWASP Juice Shop のラボ:自分のコピーで攻撃する脆弱な Web ショップ

OWASP Juice Shop は、あえて安全でなく作られたオンラインショップで、OWASP Top 10 にわたる100を超える課題があります。インジェクション、認証の不備、アクセス制御の不備、クロスサイトスクリプティング、セキュリティ設定の不備などです。このラボは、各生徒専用の非公開コピーでこれを起動するので、生徒が攻撃できるのはこれだけです。

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

生徒が学ぶこと

弱点がどう働くかを学び、それがないソフトウェアを作り守れるようになります。スコアボード(Score Board)には全課題が難易度順に並び、解くと緑になります。どこからもリンクされていないので、それを見つけることが最初の課題です。ラボのヒントはテスターの習慣です。ブラウザーが送受信する内容を見る、ページ自身のコードが何をしているかを読む、そして入力ごとにプログラムが何を信用しているかを問う、というものです。

ブラウザーで動かす

ショップは数秒で起動し、ラボを止めると状態は消えるので、翌日に続ける生徒はスコアボードが示す再開用コードを控えます。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。OWASP Juice Shopを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. ラボのページで「開く」を押すとショップが表示されます。スコアボードを見つけ、難易度順に課題を進めます。

何を提出させるか

証拠は2つに分けます。1つ目は、スコアボードで解いた課題のスクリーンショットで、ブラウザーにラボ自身のアドレスが見えるようにして、確かに自分のコピーだとわかるようにします。2つ目は、課題ごとの、自分の言葉による説明です。弱点は何か、使った入力そのもの、それがなぜ通ったか、攻撃者がそれで何をできるか、コードはどう書くべきだったか。2つ目で、理解したのか、手順書を写しただけなのかがわかります。

ここには自動採点されるものはありません。コピーは生徒だけのものですが、そのモジュールを教える教員は開くことができ、その際は生徒が読めるアクセスログに記録されます。

GitHub のコード

compose ファイルは、プロジェクト自身の公開イメージを実行します。授業の合間にラボが変わらないよう、バージョンを固定してあり、権限のないアカウントで512 MB 未満で動きます。Juice Shop は MIT ライセンスで、当社が配布するものではありません。インターネットや AI サービスを必要とする一部の課題は、外に出られないラボでは解けません。

このラボの基本レッスン

Juice Shop Basics と Juice Shop Basics 2 は、このラボで進める小さなレッスンで、各手順に説明と、生徒のターミナルにコマンドを入力する「実行」ボタンが付いています。どちらも、生徒が攻撃するのは自分のコピーだけというルールから始まります。Juice Shop Basics ではスコアボードを見つけ、いちばん易しいチャレンジを3つ解きます(2つは curl コマンドをターミナルに入力する「実行」ボタン付き)。Juice Shop Basics 2 ではオーナー向けのページを見つけ、クロスサイトスクリプティングを試します。

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

課題として出す

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

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

よくある質問

これで本物の Web サイトを攻撃できますか?
いいえ。ラボのコピーはインターネットにも他の生徒のコピーにも通じていないので、攻撃できる対象は、ラボが起動したショップだけです。
Juice Shop はどんなテーマを扱いますか?
現実的なアプリケーションの中の OWASP Top 10 です。インジェクション、認証とセッションの弱点、アクセス制御、暗号の不備、セキュリティ設定の不備、クロスサイトスクリプティング、そして方法としての脆弱性評価です。
Juice Shop では、生徒に何を提出させればよいですか?
証拠は二つの部分です。ラボ自身のアドレスが見えるScore Boardで解いたチャレンジのスクリーンショットと、それぞれについて、弱点、使った入力そのもの、なぜ通ったのか、コードはどう書くべきだったかを自分の言葉で書いた説明です。自動採点はないので、記述の部分が理解の確認になります。