Shikata Ga Nai

Private? There is no such things.

JWT authentication bypass via algorithm confusion with no exposed keyをやってみた

Hello there, ('ω')ノ

 

鍵が公開されていないアルゴリズムの混乱による JWT 認証バイパスを。

 

JWT ベースのメカニズムを使用してセッションを処理し。
堅牢な RSA キー ペアを使用して、トークンの署名と検証を行い。
ただし、このメカニズムはアルゴリズム混乱攻撃に対して脆弱で。
まずサーバーの公開鍵を取得し。
このキーを使用して、/admin の管理パネルへのアクセスを
許可するセッション トークンに署名し、carlos を削除して。
次の認証情報を使用して、自分のアカウントにログインできて。
 wiener/peter
 
ヒント:
サーバが公開鍵を X.509 PEM ファイルとして保管していると想定できて。
 

まずは、ログインして。

 

 

対象のリクエストをリピータへ。

 

 

/admin に変更し、リクエストを送信すると管理者ユーザとして

ログインしている場合にのみ、管理者パネルにアクセスできるようで。

JWT セッションCookie をコピーして、後で使用できるように保存しておいて。

 

 

ログアウトして、再度ログインして。

 

 

新しい JWT セッション Cookie をコピーして、

これで、サーバによって生成された 2 つの有効な JWT が。

 

 

ターミナルで次のコマンドを実行し、2 つの JWT を引数として渡すことに。

token1:初めにログインしたときのJWT セッションCookie 

token2:二度目にログインしたときのJWT セッションCookie

 

     docker run --rm -it portswigger/sig2n <token1> <token2>

 

 

X.509 および PKCS1 形式の Base64 でエンコードされた公開鍵と

これらの各キーで署名された改ざんされた JWTが表示されて。

 

 

セッション Cookie をこの上記の JWT に置き換えてから、リクエストを送信すると

200 応答を受け取り、アカウント ページに正常にアクセスできたので

これは正しい X.509 キーということで。

 

セッション Cookie を削除する 302 応答を受け取った場合、

/login にリダイレクトされるので間違った X.509 キーで。  

 

 

次にBase64 でエンコードされた X.509 キーをコピーして。  

 

 

JWT Editor Keysタブで、New Symmetric Keyをクリックし

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

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

これは、実際のキーで。

 

 

JWT のヘッダで、alg パラメータが HS256 に設定されていることを確認し

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

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

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

変更されたトークンは、サーバの公開鍵を秘密鍵として使用して署名されて。

 


エンドポイントを /admin に変更して送信すると。

管理パネルに正常にアクセスしたことを確認でき。

 

 

Carlos を削除するためのエンドポイントとパラメータにアクセスすると。

 

 

クリアできて。

 

 

Best regards, (^^ゞ