うつろい EC は JWT ベースの認証を採用。ログイン後に HS256 で署名された JWT を発行し、API リクエストに Authorization: Bearer ... として添付する。
サーバ側のコードに重大なバグ:JWT 内の alg ヘッダ値をそのまま採用している。alg=none が指定されたトークンに対しては署名検証をスキップしてしまう。
うつろい EC は JWT ベースの認証を採用。ログイン後に HS256 で署名された JWT を発行し、API リクエストに Authorization: Bearer ... として添付する。
サーバ側のコードに重大なバグ:JWT 内の alg ヘッダ値をそのまま採用している。alg=none が指定されたトークンに対しては署名検証をスキップしてしまう。
あなたは一般会員(role: "user")として JWT を発行された状態。alg=none 攻撃で role: "admin" に書き換えて、管理者権限を獲得してください。
alg を変更してみてください。
role を user から admin へ。
alg=none の場合は署名は空文字列でよい。それ以外の alg では正しい署名鍵が必要。
jwt.verify(token, SECRET) — alg を JWT 内の値に従う
(まだリクエストを送っていません)
// 危険:期待する alg を指定していない const decoded = jwt.verify(token, SECRET); // → alg=none も成立してしまう // 古いライブラリではこれがデフォルト挙動。最新版では明示的に算法指定が必要(セキュアバイデフォルト化)。
1. ヘッダ {"alg":"HS256",...} → {"alg":"none",...} に変更
2. ペイロードの role: "user" → "admin"
3. 署名を空文字列に
4. base64url(header) + "." + base64url(payload) + "." を送信
5. サーバ: alg=none を見て検証スキップ → ペイロードを信頼 → 管理者として処理
{"alg":"none","typ":"JWT"} に変更"role":"user" を "role":"admin" に変更