DVWA のラボ:Damn Vulnerable Web Application で SQL インジェクションと XSS を練習する
DVWA(Damn Vulnerable Web Application)は、弱点を1つずつ教えます。SQL インジェクション、ブラインド SQL インジェクション、コマンドインジェクション、クロスサイトスクリプティング(反射型・格納型)、CSRF、ファイルアップロード、ファイルインクルージョン、弱いセッション ID、総当たり攻撃などです。このラボは、データベースと一緒に、各生徒専用の非公開コピーでこれを起動します。
対象はすべて生徒自身のラボのコピーの中にあり、コピーはインターネットにも他の生徒にも通じていないため、生徒が攻撃できるのは、ラボが自分のために起動したアプリだけです。決まりはラボの冒頭に示されます。攻撃してよいのは自分のコピーだけで、自分のものでないサイトは決して攻撃しない、というものです。
生徒が学ぶこと
同じ演習を low、medium、high、impossible の4つのセキュリティレベルで行うことは、同じコードが安全でない状態から修正された状態になるのを見ることです。各演習の View Source ボタンは、現在のレベルのコードを表示するので、生徒は修正が何を変えるのか、手軽な修正ではなぜ足りないのかを見られます。安全なコーディングと修正の学習に向いています。入力の検証、出力のエンコード、パラメーター化クエリ、ファイルの扱いです。
ブラウザーで動かす
データベースはラボが生徒のために作るので、準備は不要です。セキュリティレベルは low から始まります。
- コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
- ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。DVWAを探します。
- 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
- 開く. ラボのページで「開く」を押し、ユーザー名 admin、パスワード password でサインインします。DVWA Security のページでレベルを上げられます。ラボを停止してもう一度起動すると、新しい DVWA になります。これはセットアップページの Create / Reset Database と同じです。
何を提出させるか
演習ごとに、low で解いたときと high でもう一度解いたときのスクリーンショットを、ラボ自身のアドレスが見える形で提出させます。そして演習ごとに、自分の言葉による説明を求めます。弱点は何か、使った入力、それがなぜ通ったか、high のコードがどう違うか。より高い水準を求めるなら、攻撃だけでなく修正したコードも提出させます。
GitHub のコード
compose ファイルは、DVWA 自身の公開イメージをダイジェストで固定し、MariaDB データベースと並べて、権限のないアカウントで実行します。DVWA は GPL-3.0 ライセンスで、当社が配布するものではありません。CAPTCHA の演習は、インターネット上のサービスを必要とするため使えません。
このラボの基本レッスン
DVWA Basics と DVWA Basics 2 は、このラボで進める小さなレッスンで、各手順に説明と、生徒のターミナルにコマンドを入力する「実行」ボタンが付いています。どちらも、生徒が攻撃するのは自分のコピーだけというルールから始まります。DVWA Basics では低レベルで SQL インジェクションを行い、それを許すコードを読み、不可能レベルで同じ演習が拒否されるのを確かめます。DVWA Basics 2 では同じ流れでクロスサイトスクリプティングを行います。
無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。どちらも意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、どちらかを自分のモジュールにコピーしてください。
課題として出す
どの演習を完了させ、何を提出するかを、課題に書いておきます。
- ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-dvwa とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
- 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
- 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
- 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。
よくある質問
- なぜラボは low から始まるのですか?
- 最初の試みがうまくいくようにするためです。レベルを上げて同じ演習をやり直すことが学びで、それぞれの防御が何を変えるかがわかります。
- サインインの情報は何ですか?
- admin と password で、どのコピーでも同じです。コピーは起動した生徒だけのもので、外から届くものはありません。
- DVWA では、生徒に何を提出させればよいですか?
- 各演習を low で解いた画面と high でもう一度解いた画面のスクリーンショット(ラボ自身のアドレスが見えるもの)と、それぞれについて、弱点、使った入力、なぜ通ったのか、high レベルのコードがどう違うのかを書いた説明です。より高い水準を求めるなら、攻撃だけでなく修正したコードも求めてください。