đŸ€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

Cet article vous a-t-il été utile ?