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 から始まります。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。DVWAを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. ラボのページで「開く」を押し、ユーザー名 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) に入っています。どちらも意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、どちらかを自分のモジュールにコピーしてください。

課題として出す

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

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

よくある質問

なぜラボは low から始まるのですか?
最初の試みがうまくいくようにするためです。レベルを上げて同じ演習をやり直すことが学びで、それぞれの防御が何を変えるかがわかります。
サインインの情報は何ですか?
admin と password で、どのコピーでも同じです。コピーは起動した生徒だけのもので、外から届くものはありません。
DVWA では、生徒に何を提出させればよいですか?
各演習を low で解いた画面と high でもう一度解いた画面のスクリーンショット(ラボ自身のアドレスが見えるもの)と、それぞれについて、弱点、使った入力、なぜ通ったのか、high レベルのコードがどう違うのかを書いた説明です。より高い水準を求めるなら、攻撃だけでなく修正したコードも求めてください。