JWT authentication bypass via weak signing key
概要
解読容易な署名キーを特定する
調査
- adminのように管理者が利用すると思われる画面は存在するか
- JWTで認証されているか
攻撃手順
- hashcatを使用してJWTを検証する秘密鍵を特定する
- ペイロードのnameをadministratorに変更し、特定した秘密鍵で署名し直す
- 変更したJWTを使用して管理者画面にアクセスする
対策
- 多いバイト数の文字列のように強力な秘密鍵に設定する
クリアするまでにかかった時間
- 50m
所感
リスト次第でさらに脅威な攻撃になり得ると思った。今回はデフォルトキーを狙ったものだったので、開発者は必ずデフォルトから変更することが重要だと感じた。
メモ
-
hashcatはJWTとsecret listを使って何をしているのか
-
hashcat -a 0 -m 16500 <YOUR-JWT> /path/to/jwt.secrets.listの意味-
-a 0: ストレートアタックモードを指定。これは、パスワードリストから直接パスワードを試す方法です。 -
-m 16500: JWTのハッシュタイプを指定。16500はJWTのHMAC SHA-256署名に対応しています。 -
<YOUR-JWT>: 攻撃対象のJWTトークンを指定します。 -
/path/to/jwt.secrets.list: 署名キーの候補が含まれるパスワードリストのパスを指定します。- このリストには秘密鍵の候補が羅列させれている。hashcatは指定されているJWTのヘッダーとペイロードをリストで署名した結果とJWTの3つ目のカンマの後の値が同一かで特定する。
- これにより、hashcatは指定されたJWTトークンの署名を検証するために、リスト内の各キーを試し、正しい署名キーを見つけ出します。
-
-
-
burpでselcret1をbase64エンコード
- burpかエンコードされた値を要求するため
-
jwtのペイロードのnameをadministratorに変更
- このペイロードを署名した値がサーバで検証されて管理者として扱われるため