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, (^^ゞ