Shikata Ga Nai

Private? There is no such things.

JWT authentication bypass via algorithm confusionをやってみた

Hello there, ('ω')ノ

 

アルゴリズムの混乱による JWT 認証バイパスを。

 

JWT ベースのメカニズムを使用してセッションを処理して。
堅牢な RSA キー ペアを使用して、トークンの署名と検証を行い。
ただし、実装上の欠陥により、このメカニズムはアルゴリズム混乱攻撃に
対して脆弱で。
ラボを解決するには、まずサーバの公開鍵を取得し。
これは、標準のエンドポイントを介して公開されて。
このキーを使用して、/admin で管理パネルにアクセスできるように
変更されたセッション トークンに署名してから、carlos を削除して。
次の認証情報を使用して、自分のアカウントにログインできて。
 wiener/peter
 

まずは、ログインから。

 

 

ブラウザで標準エンドポイント /jwks.json にアクセスしてみると

サーバが単一の公開鍵を含む JWK セットを公開していることが確認でき。

 

 

キー配列内から下記のJWK オブジェクトをコピーして。

 

{"kty":"RSA","e":"AQAB","use":"sig","kid":"3e6db848-1e0b-4fb0-9cde-1780748c3482","alg":"RS256","n":"p3qx9_1QWihN8wrATSqM6KHO4F378tA-dofGPdkZrBsqvwtnKEwVn_rd_SGYSRcvrbe98HG8ihPkHi20mtaz3pY_5kzYhdOblwNO9IzFGH1x7O48zdZPtIKhqbYCBAW0hrSPpBu-0EAvq5rIVSqRX-rpF6_3xnIWgJD03sHRGvWjRQDv_LJXUUOmOzmLJbePLhNSIZ48rn5OV7i2s19vIHjYJJEmihQQwv57WHscBS-CDO8xPGRnTm6hMCk0zC-Wvfv5QQuRnLQ10phbDL0A5sA9N3nPQ3s8rCNXfJiTfZd1MzhoV5PZ6PBHM_zsudoMDuRTCuXynzVXfV0ZMyeq3Q"}

 

リクエストをリピータへ。

 

 

[New RSA Key] をクリックして。

ダイアログで、JWK オプションが選択されていることを確認してから、

コピーした JWK を貼り付けて。

 [OK] をクリックしてキーを保存して。

 

 

作成したキーのエントリを右クリックし、[Copy Public Key as PEM] を選択して。

 

 

コピーした公開キーをBase64でエンコードして。

 

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp3qx9/1QWihN8wrATSqM
6KHO4F378tA+dofGPdkZrBsqvwtnKEwVn/rd/SGYSRcvrbe98HG8ihPkHi20mtaz
3pY/5kzYhdOblwNO9IzFGH1x7O48zdZPtIKhqbYCBAW0hrSPpBu+0EAvq5rIVSqR
X+rpF6/3xnIWgJD03sHRGvWjRQDv/LJXUUOmOzmLJbePLhNSIZ48rn5OV7i2s19v
IHjYJJEmihQQwv57WHscBS+CDO8xPGRnTm6hMCk0zC+Wvfv5QQuRnLQ10phbDL0A
5sA9N3nPQ3s8rCNXfJiTfZd1MzhoV5PZ6PBHM/zsudoMDuRTCuXynzVXfV0ZMyeq
3QIDAQAB
-----END PUBLIC KEY-----

 

 

次に[New Symmetric Key] をクリックし。  

ダイアログで [Generate] で、JWK 形式で新しいキーを生成して。  

キー サイズは後で自動的に更新されるため、選択する必要はなく。

生成された k プロパティの値を、Base64 でエンコードされた PEM に置き換えて。

 

 

JWT のヘッダで、alg パラメータの値を HS256 に変更して。

ペイロードで、sub クレームの値をadministratorに変更して。

 

 

[Sign] をクリックし、生成した対称キーを選択して。

[Don't modify header] オプションが選択されていることを確認し、

[OK] をクリックすると変更されたトークンは、サーバの公開鍵を秘密鍵として

署名されて。

 

 

そして、/adminのエンドポイントへリクエストすると

管理パネルにアクセスできて。

 

 

carlosを削除するエンドポイントとパラメータをリクエストすると。

 

 

クリアできて。

 

 

Best regards, (^^ゞ