پرش به محتوای اصلی
友田 陽大
実践Webハッキング技法
セキュリティ
ホワイトハッカー
認証
脆弱性診断
Webセキュリティ

認証の脆弱性の完全攻略【2026】ユーザー名列挙・総当たり・2FAバイパス・パスワードリセット — 公式ドキュメント忠実版

認証(ログイン)機構の脆弱性と攻撃手法を、PortSwigger Web Security Academyに忠実に深掘り。ユーザー名列挙(メッセージ差・応答時間差)、総当たりとレート制限の回避、アカウントロックの抜け穴、多要素認証(2FA/MFA)のバイパス、パスワードリセットの汚染、Remember Me/パスワード変更の不備、そしてレート制限・一定応答・MFA・安全なリセット設計による根本対策までを、自分のラボ限定で解説します。

Published
Reading time
7 min read
Author
友田 陽大
هم‌رسانی

認証は、アプリのセキュリティの最前線です。ここが破れれば、その先の認可も暗号も意味をなしません。PortSwigger が言う通り「認証の脆弱性は、攻撃者に機密データへのアクセスを許し」、特権アカウントを奪われればアプリ全体が乗っ取られます。本記事は、その攻撃手法を公式に忠実に解説します。

絶対の前提: 総当たり・列挙・リセット汚染は、いずれも強い侵襲性を持ちます。実行は 合法ラボ または書面で許可されたスコープでのみ。無許可のログイン試行は、それ自体が不正アクセス行為です(→ 法律ガイド)。地図は ピラー


1. ユーザー名列挙 — 攻撃の第一段

総当たりの前に、「存在する有効なユーザー名」を確定させると効率が跳ね上がります。アプリは、しばしばわずかな差でユーザーの存在を漏らします。

漏洩の信号
メッセージの差「ユーザー名が不正」 vs 「パスワードが不正」
応答時間の差存在するユーザーだけハッシュ照合が走り、応答が遅い
HTTPステータス/微妙な文言差末尾の句点の有無、リダイレクト先の違い
# Burp Intruder で username を辞書にして送り、レスポンスの差分(長さ・文言・時間)を観察
POST /login HTTP/1.1
Host: lab.example
Content-Type: application/x-www-form-urlencoded

username=§candidate§&password=wrongpass

Burp IntruderSniper 攻撃で username 位置だけを回し、レスポンス長や応答時間の外れ値から有効ユーザーを割り出します。


2. 総当たり(ブルートフォース)と保護の回避

有効ユーザー名が判明したら、パスワードを総当たりします。問題は保護機構の不備です。

2.1 IPベースのレート制限の回避

「同一IPから一定回数失敗したらブロック」は、ヘッダ偽装やIPローテーションで回避され得ます。

# X-Forwarded-For を毎回変えて、IPベースのカウンタを欺く(脆弱な実装で有効)
X-Forwarded-For: 1.2.3.4

2.2 アカウントロックの抜け穴 — パスワードスプレー

「1ユーザーがN回失敗でロック」は、多数のユーザーに同じ弱いパスワードを1回ずつ試すパスワードスプレーで回避されます。各ユーザーの失敗回数はロック閾値に届きません。

# 縦に弱いパスワードを固定し、横に大量ユーザーを試す(Pitchfork/Cluster bomb的)
user001 : Password1!
user002 : Password1!
...                      ← どのユーザーもロックされない

さらに、ロックされたという応答自体が「このユーザーは存在する」という列挙の信号になります。


3. 多要素認証(2FA/MFA)のバイパス

MFAは強力ですが、正しく実装されて初めて効きます。PortSwigger が挙げる典型的な穴:

3.1 検証ロジックの欠落(2段目を飛ばす)

1段目(パスワード)成功後に発行されるセッションが、2段目未完了でも保護リソースへ到達できる場合。2FA入力画面をスキップして、直接遷移先URLを叩くと通ってしまう。

# 2FAページを経由せず、ログイン後のページへ直接アクセスして通るか確認
GET /my-account HTTP/1.1
Host: lab.example
Cookie: session=<1段目だけ通したセッション>

3.2 OTPの総当たり

検証コード(OTP)に試行回数制限・レート制限がないと、4〜6桁を総当たりできます。Burp Intruder00009999 を回すだけで突破され得ます。

3.3 ユーザーの取り違え

2段階目の検証が、1段目のユーザーと別のユーザーのコードを受け付けてしまう実装ミス。アカウント識別をクライアント任せにすると起きます。


4. その他の機構 — リセット・Remember Me・変更

4.1 パスワードリセットの汚染(裏口)

パスワードリセットは「本人確認を一時的に緩める」ため、認証の裏口になりやすい。

  • 推測可能なトークン:連番・タイムスタンプ・短いトークンは予測される。
  • Hostヘッダ汚染:リセットリンクの生成に Host ヘッダを使っていると、攻撃者が Host: evil.example を送り、被害者宛のメールに攻撃者ドメインのリンクを仕込める。被害者がクリックするとトークンが攻撃者に渡る。
  • 識別子の差し替え:リセット確定リクエストの username/userId を他人に変えられると、他人のパスワードを設定できる。
# Hostヘッダ汚染:被害者宛リセットメールのリンクが攻撃者ドメインを指すよう仕込む
POST /forgot-password HTTP/1.1
Host: evil-attacker.example          ← サーバーがこれを信頼してリンク生成すると致命的
Content-Type: application/x-www-form-urlencoded

username=victim

4.2 Remember Me / パスワード変更

「ログイン状態を保持」のトークンが推測可能(ユーザー名のハッシュ等)だと偽造される。パスワード変更が現行パスワードを確認しないと、セッション奪取後の永続化に使われます。


5. 【守る側】根本対策

攻撃面を理解したら、設計で塞ぎます。PortSwigger と OWASP Authentication Cheat Sheet の要諦:

// ✅ ユーザー名列挙を防ぐ:成否で「同一の」メッセージ・同等の処理時間を返す
async function login(username: string, password: string) {
  const user = await findUser(username);
  // ユーザーが存在しなくても必ずハッシュ照合を走らせ、応答時間を一定化(タイミング差を消す)
  const hash = user?.passwordHash ?? DUMMY_HASH;
  const ok = await verifyPassword(password, hash); // Argon2id 等
  if (!user || !ok) {
    // 列挙を許さない一定の文言(どちらが違うかを明かさない)
    throw new AuthError("ユーザー名またはパスワードが正しくありません");
  }
  // ...
}

設計原則:

  • 列挙を塞ぐ:成否で同一メッセージ・同等の応答時間・同一ステータス
  • 堅牢なレート制限:IPだけでなくアカウント単位 + グローバルで。X-Forwarded-For を信頼しない。サーバーレスでの正しいレート制限は 専用ガイド
  • MFAを正しく実装:2段目完了まで保護リソースへ到達させない。OTPに試行回数制限。コードは短命・単回・1段目ユーザーに束縛
  • パスワードリセットの安全化推測不能(CSPRNG)で長く・短命・単回・ユーザー束縛のトークン。リンク生成に Host ヘッダを使わず、サーバー側の正規URLを信頼する(HTTP Host header攻撃対策)。
  • パスワード強度とハッシュ:Argon2id等で保存し、弱いパスワードを拒否。詳細は パスワードハッシュ・暗号ガイド
  • セッション:認証後にセッションIDを再生成、HttpOnly/Secure/SameSite を付与。

認証基盤そのものをマネージドに寄せる選択(Cognito/Auth0/Clerk/Supabase Auth)は 認証プラットフォーム選定 を参照。**「認証は自前実装しない」**のが、多くのプロジェクトで最も安全な判断です。


6. まとめ

  • 列挙→総当たりの2段構え:まず有効ユーザー名を、メッセージ差・時間差から特定。
  • 保護機構は回避される:IP制限はヘッダ偽装、ロックはパスワードスプレーで。
  • MFAは実装次第:2段目スキップ・OTP総当たり・ユーザー取り違えに注意。
  • リセットは裏口:推測可能トークン・Hostヘッダ汚染・識別子差し替え。
  • 根本対策:一定応答で列挙封じ + 堅牢なレート制限 + 正しいMFA + 安全なリセット + 強ハッシュ。

次は、テンプレートエンジンを乗っ取ってRCEに至る SSTIの完全攻略 へ。


参考(公式一次情報)

友田

友田 陽大

سازندهٔ محصولی برندهٔ جایزهٔ وزیر (METI). با TypeScript + Python + AWS، به‌تنهایی SaaS، تحول دیجیتال صنعتی و هوش مصنوعی مولد (RAG) آمادهٔ تولید را از تعریف نیازمندی تا زیرساخت و بهره‌برداری تحویل می‌دهم.

What if this attack were reproduced on your app?

Web-app vulnerability assessment & penetration testing

I actually reproduce and assess the SQLi, XSS, SSRF, JWT, auth, and SSTI attacks covered here on your app, and take it through from design to fix. Only those who know the attacker's moves can preempt where it breaks at the design stage. You're welcome to visualize the current state with the free OSS first.

هم برای کار پروژه‌ای و هم برای مشاورهٔ فنی در دسترس هستم. با یک مشاورهٔ رایگان ۳۰ دقیقه‌ای شروع کنید.

最短ルート:カレンダーから直接予約

相談内容が固まっている方は、フォーム送信よりその場で日程を確定する方がスムーズです。下記から空き時間をお選びください。

  • 30分のオンライン無料相談
  • Google Meet / Zoom / Microsoft Teams
  • NDA 商談前締結可・無理な営業はいたしません
無料相談の空き枠を予約する

خواندنش خالی از لطف نیست