# HTTP Smuggling

## Sites

* <https://tools.honoki.net/smuggler.html>

## Basic

Les attaques de contrebande de requêtes impliquent de placer à la fois l'en-tête `Content-Length` et l'en-tête `Transfer-Encoding` dans une seule requête HTTP et de les manipuler de sorte que les serveurs front-end et back-end traitent la requête différemment. La manière exacte dont cela se fait dépend du comportement des deux serveurs :

* CL.TE : le serveur front-end utilise l'en-tête `Content-Length` et le serveur back-end utilise l'en-tête`Transfer-Encoding`.
* TE.CL : le serveur front-end utilise l'en-tête `Transfer-Encoding`et le serveur back-end utilise l'en-tête `Content-Length`.
* TE.TE : les serveurs front-end et back-end prennent tous deux en charge l'en-tête `Transfer-Encoding`, mais l'un des serveurs peut être incité à ne pas le traiter en masquant l'en-tête d'une manière ou d'une autre.

### CL.TE

Dans ce cas, le serveur front-end utilise l'en-tête `Content-Length` et le back-end l'en-tête `Transfer-Encoding`.

Il est donc possible d'exploiter la cible comme ceci:

```
POST / HTTP/1.1
Host: target.com
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED
```

Le serveur front-end traite l'en-tête `Content-Length` et détermine que le corps de la requête a une longueur de 13 octets, jusqu'à la fin de `SMUGGLED`. Cette demande est transmise au serveur principal.

Le serveur principal traite l'en-tête `Transfer-Encoding` et traite donc le corps du message comme utilisant un codage fragmenté. Il traite le premier bloc, qui est déclaré être de longueur nulle, et est donc traité comme mettant fin à la demande. Les octets suivants, `SMUGGLED`, ne sont pas traités et le serveur principal les traitera comme étant le début de la requête suivante dans la séquence.

### TE.CL

Dans ce cas, le serveur front-end utilise l'en-tête `Transfer-Encoding` et le back-end l'en-tête `Content-Length`.

Il est donc possible d'exploiter la cible comme ceci:

```
POST / HTTP/1.1
Host: target.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0
```

{% hint style="info" %}
Pour envoyer cette requête à l'aide de Burp Repeater, vous devrez d'abord vous rendre dans le menu Repeater et vous assurer que l'option "Update Content-Length" est décochée.

Vous devez inclure la séquence de fin `\r\n\r`après le final `0`.
{% endhint %}

Ici, le serveur front-end traite l'en-tête `Transfer-Encoding` et traite ainsi le corps du message comme utilisant un codage fragmenté. Il traite le premier bloc, qui est censé avoir une longueur de 8 octets, jusqu'au début de la ligne suivant `SMUGGLED`. Il traite le deuxième bloc, qui est déclaré être de longueur nulle, et est donc traité comme mettant fin à la demande. Cette demande est transmise au serveur back-end.

Le serveur back-end traite l'en-tête `Content-Length` et détermine que le corps de la requête a une longueur de 3 octets, jusqu'au début de la ligne suivant `8`. Les octets suivants, commençant par `SMUGGLED`, ne sont pas traités et le serveur principal les traitera comme étant le début de la requête suivante dans la séquence

### TE.TE

Pour ce dernier cas, pour découvrir une vulnérabilité TE.TE, il est nécessaire de trouver une variation de l' en-tête `Transfer-Encoding` telle qu'un seul des serveurs front-end ou back-end la traite, tandis que l'autre serveur l'ignore.

Selon que c'est le serveur front-end ou le serveur back-end qui peut être amené à ne pas traiter l'en-tête `Transfer-Encoding`obfusqué, la suite de l'attaque prendra la même forme que pour les vulnérabilités CL.TE ou TE.CL déjà décrites.

Il existe des façons potentiellement infinies d'obfusquer l'en-tête `Transfer-Encoding.`

Quelques exemples ci-dessous:

```
Transfer-Encoding: xchunked

Transfer-Encoding : chunked

Transfer-Encoding: chunked
Transfer-Encoding: x

Transfer-Encoding:[tab]chunked

[space]Transfer-Encoding: chunked

X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding
: chunked
```


---

# Agent Instructions: 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:

```
GET https://blog.s1rn3tz.ovh/pentest-web/http-smuggling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
