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() を使う |
ライブラリ設定の強化 | 許可アルゴリズムをホワイトリスト制にする |
🎉 結果
sub
を administrator
に書き換えた署名なしトークンを利用することで、
管理者になりすまし、ユーザーを削除できることを確認。
Best regards, (^^ゞ