クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

破られやすいサインインとセッション

このレッスンのあとで: サインインやセッションを弱くするものを、挙げられる。

55分のレッスンコマンド3件WebGoat のラボ:自分のコピーで WebWolf と進める、手順つきの Web セキュリティ学習

パスワードが「Password1」

従業員30人の会社に、社員用のサイトがあります。初期パスワードが Password1 のまま、変えていない人が何人もいました。

ある晩、誰かがよくあるパスワードを数十個、社員名簿の全員に試しました。数分で経理担当のアカウントに入れました。このサイトには、失敗の回数に制限がなかったのです。

たった1つのルール

注意

攻撃してよいのは、自分専用のラボのコピーだけです。このラボは、わざと弱く作った教材で、インターネットにはつながっていません。許可のない他人のシステムを攻撃すると、不正アクセス禁止法に触れる犯罪になります。

このレッスンのゴール

メモ

サインインやセッションを弱くするものを、挙げられる。

今日のキーワード

ことばいみれい
セッションサイトが、あなたはサインイン済みだと覚えている間です。
Cookieブラウザが持ち、サイトへ送り返す小さな値です。
トークンサインインしたことを示す値です。長い文字列
ハッシュパスワードを、元に戻せない決まった長さの文字に変えたものです。
ブルートフォース総当たりで、たくさんの候補を順に試すことです。
有効期限セッションやトークンが使えなくなる時刻です。

学生が入力するセルは、このプレビューでは空白です。

弱いパスワードは当てられる

人は、短くてありふれたパスワードを選びます。攻撃する人に必要なのは、ありふれたパスワードの一覧と、何度でも試させてくれるサイトだけです。これが ブルートフォース です。

守りは3つを合わせます。長さを求めます。一覧にあるパスワードを断ります。失敗が続いたら、遅くするか、止めます。

例: 4つのパスワードを判断

パスワード判断理由
123456断るどの一覧にも載っている
Summer2025!弱い季節と年と記号は、よくある型
kaisha-torakku-nana-boshiよい長くて、型がない
sato断る短く、ユーザー名と同じ

学生が入力するセルは、このプレビューでは空白です。

保存するのはハッシュ

サイトは、パスワードをそのまま保存してはいけません。記録が漏れたとき、全員のアカウントが漏れるからです。

保存するのは、パスワードの ハッシュ です。先にランダムな塩(ソルト)を足すので、同じパスワードの2人でも、ハッシュは違います。サインインのときは、入力を同じ方法で変えて、比べます。

セッションの Cookie は鍵

サインインすると、サイトはブラウザにセッションの Cookie を渡します。以後のリクエストでは、その Cookie で本人だと分かります。その値を持つ人は、本人として動けます。

だから、ランダムで長いこと、HTTPS だけで送ること、HttpOnly でスクリプトから隠すこと、期限があることが必要です。サインインのたびに、新しい値を発行します。

ラボのセッションを見る

ラボでは WebGoat が動いています。起動して、1分ほど待ちます。次の3つの Run は、サインインせずに玄関を見るだけです。

2つ目は、サインインが要るページを頼みます。3つ目は、その返事が出す Cookie を表示します。

サインインページは動くか

コマンド
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" http://web/WebGoat/login

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

サインインが要るページ

コマンド
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" http://web/WebGoat/welcome.mvc

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

その返事の Cookie

コマンド
curl -s -I http://web/WebGoat/welcome.mvc | grep -i "^set-cookie"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

3つの答えを読む

1つ目は 200 を表示し、移動先のアドレスはありません。2つ目は 302 とサインインページのアドレスを表示します。サインインが要るページは、知らない人を玄関へ戻します。

3つ目は、Path=/WebGoat; HttpOnly の付いた JSESSIONID です。値はランダムで、毎回変わります。HttpOnly はありますが、Secure はありません。このラボは、ふつうの HTTP だからです。

よくある間違い

注意

「ランダムな文字に見えるトークンは、隠れている」と考える人がいます。それは違います。エンコードは暗号化ではありません。ユーザー名をエンコードしただけのトークンは、誰でも読めて、書き換えられます。サーバーが引くランダムなセッションID、または署名をサーバーが確かめるトークンを使い、有効期限も確かめます。

トークンは署名と期限が要る

ユーザー名とロールと期限を入れた、署名つきのトークンを渡すサイトがあります。サーバーは、中身を信じる前に署名を確かめます。

署名のないトークン、サーバーが確かめないトークン、期限のないトークンは、弱いトークンです。この3つは断ります。

例: 3つのトークン

トークンの中身署名判断
ユーザー sato、ロール一般、明日まであり受け入れる
ユーザー sato、ロール管理者、明日までなし断る。管理者を保証する人がいない
ユーザー sato、ロール一般、先週まであり断る。期限切れ

学生が入力するセルは、このプレビューでは空白です。

このラボとソースについて: WebGoat のラボ:自分のコピーで WebWolf と進める、手順つきの Web セキュリティ学習

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。