Shikata Ga Nai

Private? There is no such things.

LAB: JWTを用いた署名検証の不備による認証バイパス

Hello there, ('ω')ノ

🔒 対象

このラボでは、JWT(JSON Web Token)によるセッション管理を行っているWebアプリケーションにおいて、署名を正しく検証していない脆弱な実装を突き、管理者アカウントへ不正にログインする方法を学びます。


🎯 目的

署名を除去した alg: none のトークンを用いて管理者に偽装し、 /admin パネルからユーザー「carlos」を削除する。


🛠 攻略手順

① 通常ログインしてJWTを取得

  • wiener : peter でログイン
  • Burp Suite の HTTP history タブで /my-account へのリクエストを確認
  • session クッキーの値がJWT形式(header.payload.signature)になっている

② JWTを編集

▶ Burp Repeaterに送る

  • 対象リクエストを Repeater に送信

▶ Payload を編集

  • JWTの中間部分(Payload)を Base64URL デコード
  • "sub": "wiener""sub": "administrator" に書き換え
  • 変更後、再エンコードして反映

▶ Header を編集

  • {"alg":"HS256",...}{"alg":"none"} に書き換え
  • エンコード後、JWTの最後の署名部分を削除し、末尾にピリオドだけ残す
  <base64(header)>.<base64(payload)>.

③ 管理者アクセスと操作

  • JWTを含む状態で /admin にアクセス → 管理パネルに入れる
  • /admin/delete?username=carlos にアクセス → ユーザー削除

🧠 解説:なぜ脆弱なのか?

JWTの検証では、本来署名を「秘密鍵」で照合してトークンの改ざん有無をチェックします。

ところがこのラボでは:

  • alg がクライアントからの入力に従って none に設定されてしまう
  • 署名が不要な状態で payload の内容がそのまま信頼されてしまう

これにより改ざんされたJWTを誰でも受け入れてしまうため、管理者権限の偽装が可能になります。


✅ 攻略のコツ

  • JWTの各パートを正しく分解・編集・再構成する
  • alg=none の場合、署名が不要であることに注意
  • トークン構造の .(ドット) 区切りを忘れずに!

🛡 対策

対策 説明
alg=none の拒否 サーバー側で明示的に拒否する設定を行う
署名検証の徹底 decode() ではなく verify() を使う
ライブラリ設定の強化 許可アルゴリズムをホワイトリスト制にする

🎉 結果

subadministrator に書き換えた署名なしトークンを利用することで、 管理者になりすまし、ユーザーを削除できることを確認。

Best regards, (^^ゞ