このレッスンでやること
Web サイトは、SQL という言語で書いた質問で、データベースから情報を取り出します。入力した文字をそのまま質問に貼りつけていると、質問を書き換えられてしまいます。これを SQL インジェクションといい、Web でもっともよくある弱点の 1 つです。DVWA なら安全に試せて、そのあと直し方も見られます。
大事なルール
注意
このラボは、わざと安全でなく作ったWeb サイトを動かします。攻撃してよいのは、このサイトだけです。あなた専用のコピーで、インターネットにはつながっていないので、ほかの人に影響はありません。自分のものでないサイトで、これらを試してはいけません。英国のコンピューター不正使用法(Computer Misuse Act 1990)では犯罪にあたります。
始める前に
メモ
このレッスンの上にあるバーのラボを起動を押し、「実行中」と出るまで待ちます。Web サイトは、バーの DVWA のリンクから開きます。下の実行ボタンは、それぞれのコマンドをラボのターミナルに順番に入力します。すべて同じセッションで動きます。様子を見たり、自分でコマンドを打ったりしたいときは、バーのターミナルを開く(新しいタブ)を押します。
1. Web サイトが動いているか確かめる
ラボのバーには「実行中」と出ています。次はWeb サイトを確かめます。このコマンドはターミナルからサインインページを求めます。200 は、答えが返ってきたという意味です。
curl -s -o /dev/null -w "%{http_code}\n" http://dvwa/login.phpここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2. サインインする
バーの DVWA のリンクを押し、ユーザー名 admin、パスワード password でサインインします。左のメニューから DVWA Security を選び、low になっていることを確かめます。
3. ふつうの質問をする
メニューから SQL Injection を選びます。User ID の欄に 1 と入力して Submit を押します。Web サイトは、ユーザー admin を 1 人だけ表示します。入力した文字から、「ID が 1 のユーザーをください」という質問を作ったのです。
4. 質問を書き換える
同じ欄に次の文字を入力して、Submit を押します。
1' OR '1'='1
' がWeb サイトの質問を途中で終わらせ、OR '1'='1 が、いつも正しい条件を足しました。すると 全員、つまり admin、Gordon、Hack、Pablo、Bob が表示されます。1 人をたのんだのに全員が出てきたのは、Web サイトが入力された文字を信用したからです。
5. コードを読む
ページの下にある View Source(ソースを見る)を押します。low では、入力した文字がそのまま質問に入っています。これが間違いです。
6. 直し方を見る
DVWA Security を選び、レベルを impossible にして Submit を押します。SQL Injection に戻って 1 を入力すると、やはり admin が表示されます。次にステップ 4 の文字を入力すると、何も表示されません。もう一度 View Source を押してみましょう。コードは、ID が数字かどうかを確かめています。そして質問と入力した文字を別々に送るので、入力した文字は値としてしか扱われず、質問の一部にはなりません。これをパラメータ化クエリといい、Web サイトがこの攻撃を防ぐ方法です。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。手順と実行ボタンがレッスンで、ラボは生徒一人ひとりの専用コピーです。DVWA には、同じ 4 つのレベルで試せる演習が、ほかに 10 個あります。同じラボで 1 つの単元をまかなえます。採点は自動ではありません。各演習について、low と impossible のスクリーンショットと、何が変わったかを説明する 1 文を出させてください。自分のモジュールにコピーして変えることも、レッスンビルダーのラボメニューから一から作ることもできます。