パスワードが「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、ロール一般、先週まで | あり | 断る。期限切れ |
学生が入力するセルは、このプレビューでは空白です。