Shikata Ga Nai

Private? There is no such things.

ユーザー名列挙(Username Enumeration)とは?攻撃者がユーザー存在を判定する手口

Hello there, ('ω')ノ

✅ ユーザー名列挙とは?

「そのユーザー名が存在するかどうか」をWebアプリの挙動から推測する攻撃手法です。

🎯 目的:

有効なユーザー名だけを絞り込んで、ブルートフォース攻撃を効率化すること


🔍 攻撃が成立する典型的なケース

① ログイン画面での挙動の違い

状況 表示メッセージ
存在しないユーザー ユーザー名が無効です
存在するがパスワードが間違い パスワードが間違っています

→ これにより、ユーザー名の存在有無を区別できてしまう


② 登録フォームでのメッセージ

  • 例:そのユーザー名は既に使われています
  • → 存在するユーザー名がわかってしまう

③ パスワードリセットページ

  • メールアドレス入力 → 「そのアドレスにはリセットリンクを送信しました」
  • ※ただし、実際には送っていない場合でもこの表示をすることで対策可能(偽装メッセージ

✅ なぜ危険なのか?

  1. 攻撃者が有効なユーザー一覧を作れる
  2. 対象が絞られるため、ブルートフォース攻撃のコストが激減
  3. 管理者アカウント(admin, support)などの存在も露呈

🔐 防ぐためには?

対策 内容
✅ 一貫したエラーメッセージ ユーザー名またはパスワードが違います を固定で表示
✅ 同じステータスコード 例:常に HTTP 200 OK を返す
✅ レスポンス時間を揃える 違いが出ないように調整する
✅ CAPTCHA の導入 自動試行の難易度を上げる

✅ まとめ

  • ユーザー名列挙は、Webアプリの“わずかな差”を見逃さない攻撃
  • 存在確認のための正直なレスポンスは、攻撃者の手助けにしかならない
  • 「本当にそのユーザーがいるか」は絶対に推測させてはいけない情報

Best regards, (^^ゞ