Mutillidae のラボ:脆弱な PHP の Web アプリで SQL インジェクションと XSS を練習する
OWASP Mutillidae II は、わざと弱点を組み込んだ PHP のサイトで、OWASP Top 10 をはじめ、SQL インジェクション、クロスサイトスクリプティング、コマンドインジェクション、LDAP インジェクションなど多くの弱点が入っていて、各ページにヒントがあります。このラボは、データベースと LDAP ディレクトリと一緒に、各生徒専用の非公開コピーでこれを起動します。
対象はすべて生徒自身のラボのコピーの中にあり、コピーはインターネットにも他の生徒にも通じていないため、生徒が攻撃できるのは、ラボが自分のために起動したアプリだけです。決まりはラボの冒頭に示されます。攻撃してよいのは自分のコピーだけで、自分のものでないサイトは決して攻撃しない、というものです。
生徒が学ぶこと
本物らしいサイトで OWASP Top 10 を学べ、選べる弱点がたくさんあります。サイトにはセキュリティレベル 0、1、5 があり、メニューから切り替えられるので、同じ演習をもう一度行って、修正で何が変わるかを確かめられます。ユーザー検索に入れた名前は、レベル 0 ではすべてのアカウントを見つけ、レベル 5 では何も見つけません。Web セキュリティや安全なコーディングの入門に向いていて、入力の検証、出力のエンコード、パラメーター化クエリ、認証、セッションを扱えます。
ブラウザーで動かす
データベースはラボが生徒のために作るので、準備は不要で、サイトが使えるようになってから「実行中」と表示されます。
- コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
- ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。OWASP Mutillidae IIを探します。
- 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
- 開く. ラボのページで「開く」を押します。各ページの上部にセキュリティレベルが表示され、最初は 0 です。アカウントを求めるページには、ユーザー名 admin、パスワード adminpass でサインインします。Toggle Hints と Toggle Security はメニューにあります。ラボを停止してもう一度起動すると、Reset DB と同じく新しいサイトになります。
何を提出させるか
解いた演習ごとに、ラボ自身のアドレスが見える形でスクリーンショットを提出させます。そして演習ごとに、自分の言葉による説明を求めます。弱点は何か、使った入力、それがなぜ通ったか、コードをどう書くべきだったか。より高い水準を求めるなら、同じ演習をレベル 5 でも行い、そこでコードが何を違うやり方でしているかも提出させます。
このラボの基本レッスン
Mutillidae Basics は、このラボで進める小さなレッスンで、生徒が攻撃するのは自分のコピーだけというルールから始まります。生徒はターミナルから curl でサインインし、名前でアカウントを 1 つ調べ、名前を変えてすべてのアカウントが見つかるようにし、そのあとセキュリティレベルを上げて、同じ入力では何も見つからないことを確かめます。
無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、自分のモジュールにコピーしてください。
GitHub のコード
compose ファイルは、Mutillidae プロジェクト自身の公開イメージ 3 つ、つまりサイト、MariaDB データベース、LDAP ディレクトリを、それぞれバージョンとダイジェストで固定し、変更せずに実行します。Mutillidae は GPL-3.0 ライセンスで、作者のものであり、当社は配布していません。ラボにはインターネットへの出口がないため、ほかのサイトからページを取得するものは、届く先がありません。
課題として出す
どの演習を完了させ、何を提出するかを、課題に書いておきます。
- ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-mutillidae とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
- 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
- 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
- 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。
よくある質問
- サインインの情報は何ですか?
- ユーザー名 admin、パスワード adminpass で、どのコピーでも同じです。Login/Register のページでほかのアカウントも作れます。コピーは起動した生徒だけのもので、外から届くものはありません。
- 再起動するとサイトが最初の状態に戻るのはなぜですか?
- データベースはラボが起動するたびに新しく作られ、保存されません。演習で壊れたサイトは、ラボを停止してもう一度起動するか、メニューの Reset DB で直ります。
- なぜそんなにメモリが必要なのですか?
- このラボはサイト、データベース、ディレクトリの 3 つのプログラムで、それぞれ 512、384、256 メガバイトに制限されています。待機中は 3 つで約 210 メガバイトを使い、コピーに許される量に十分収まります。