đ€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-Encoding
et le serveur back-end utilise l'en-tĂȘteContent-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
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
DerniĂšre mise Ă jour
Cet article vous a-t-il été utile ?