๐ŸคHTTP Smuggling

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รชteTransfer-Encoding.

  • TE.CL : le serveur front-end utilise l'en-tรชte Transfer-Encodinget 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

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\raprรจs le final 0.

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-Encodingobfusquรฉ, 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

Derniรจre mise ร  jour