Request Smuggling in HTTP/2 Downgrades

Reading time: 6 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

HTTP/2 est gĂ©nĂ©ralement considĂ©rĂ© comme immunisĂ© contre le request-smuggling classique car la longueur de chaque trame DATA est explicite. Cette protection disparaĂźt dĂšs qu'un proxy frontal “downgrade” la requĂȘte en HTTP/1.x avant de l'envoyer Ă  un back-end. Au moment oĂč deux parseurs diffĂ©rents (le front-end HTTP/2 et le back-end HTTP/1) essaient de s'accorder sur l'endroit oĂč une requĂȘte se termine et oĂč la suivante commence, tous les anciens trucs de dĂ©synchronisation reviennent – plus quelques nouveaux.


Pourquoi les downgrades se produisent

  1. Les navigateurs parlent déjà HTTP/2, mais une grande partie de l'infrastructure d'origine héritée ne comprend encore que HTTP/1.1.
  2. Les reverse-proxies (CDNs, WAFs, load-balancers) terminent donc TLS + HTTP/2 Ă  la pĂ©riphĂ©rie et réécrivent chaque requĂȘte en HTTP/1.1 pour l'origine.
  3. L'Ă©tape de traduction doit crĂ©er Ă  la fois des en-tĂȘtes Content-Length et/ou Transfer-Encoding: chunked afin que l'origine puisse dĂ©terminer la longueur du corps.

Chaque fois que le front-end fait confiance Ă  la longueur de la trame HTTP/2 mais que le back-end fait confiance Ă  CL ou TE, un attaquant peut les forcer Ă  ne pas ĂȘtre d'accord.


Deux classes primitives dominantes

VarianteLongueur front-endLongueur back-endCharge utile typique
H2.TETrame HTTP/2Transfer-Encoding: chunkedIntĂ©grer un corps de message chunked supplĂ©mentaire dont le final 0\r\n\r\n n'est pas envoyĂ©, de sorte que le back-end attende la “prochaine” requĂȘte fournie par l'attaquant.
H2.CLTrame HTTP/2Content-LengthEnvoyer un CL plus petit que le vrai corps, de sorte que le back-end lise au-delĂ  de la limite dans la requĂȘte suivante.

Celles-ci sont identiques en esprit aux classiques TE.CL / CL.TE, juste avec HTTP/2 remplaçant l'un des parseurs.


Identification d'une chaĂźne de downgrade

  1. Utilisez ALPN dans une poignée de main TLS (openssl s_client -alpn h2 -connect host:443) ou curl :
bash
curl -v --http2 https://target

Si * Using HTTP2 apparaĂźt, la pĂ©riphĂ©rie parle H2. 2. Envoyez une requĂȘte CL/TE dĂ©libĂ©rĂ©ment malformĂ©e sur HTTP/2 (Burp Repeater a maintenant un menu dĂ©roulant pour forcer HTTP/2). Si la rĂ©ponse est une erreur HTTP/1.1 telle que 400 Bad chunk, vous avez la preuve que la pĂ©riphĂ©rie a converti le trafic pour un parseur HTTP/1 en aval.


Workflow d'exploitation (exemple H2.TE)

http
:method: POST
:path: /login
:scheme: https
:authority: example.com
content-length: 13      # ignored by the edge
transfer-encoding: chunked

5;ext=1\r\nHELLO\r\n
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
  1. Le front-end lit exactement 13 octets (HELLO\r\n0\r\n\r\nGE), pense que la requĂȘte est terminĂ©e et transmet cette quantitĂ© Ă  l'origine.
  2. Le back-end fait confiance Ă  l'en-tĂȘte TE, continue de lire jusqu'Ă  ce qu'il voit le deuxiĂšme 0\r\n\r\n, consommant ainsi le prĂ©fixe de la deuxiĂšme requĂȘte de l'attaquant (GET /admin 
).
  3. Le reste (GET /admin 
) est traitĂ© comme une nouvelle requĂȘte mise en file d'attente derriĂšre celle de la victime.

Remplacez la requĂȘte dissimulĂ©e par :

  • POST /api/logout pour forcer la fixation de session
  • GET /users/1234 pour voler une ressource spĂ©cifique Ă  la victime

h2c smuggling (mises Ă  niveau en texte clair)

Une Ă©tude de 2023 a montrĂ© que si un front-end passe l'en-tĂȘte HTTP/1.1 Upgrade: h2c Ă  un back-end qui prend en charge HTTP/2 en texte clair, un attaquant peut tunneliser des trames HTTP/2 brutes Ă  travers un edge qui ne validait que HTTP/1.1. Cela contourne la normalisation des en-tĂȘtes, les rĂšgles WAF et mĂȘme la terminaison TLS.

Exigences clés :

  • L'edge transmet Ă  la fois Connection: Upgrade et Upgrade: h2c sans changement.
  • L'origine passe Ă  HTTP/2 et conserve la sĂ©mantique de rĂ©utilisation de connexion qui permet la mise en file d'attente des requĂȘtes.

L'attĂ©nuation est simple : supprimer ou coder en dur l'en-tĂȘte Upgrade Ă  l'edge sauf pour les WebSockets.


CVEs notables dans le monde réel (2022-2025)

  • CVE-2023-25690 – Les rĂšgles de réécriture mod_proxy d'Apache HTTP Server pourraient ĂȘtre enchaĂźnĂ©es pour le fractionnement et le smuggling de requĂȘtes. (corrigĂ© dans 2.4.56)
  • CVE-2023-25950 – Smuggling de requĂȘtes/rĂ©ponses HAProxy 2.7/2.6 lorsque le parseur HTX gĂ©rait mal les requĂȘtes en pipeline.
  • CVE-2022-41721 – Le MaxBytesHandler de Go a causĂ© des octets de corps restants Ă  ĂȘtre analysĂ©s comme des trames HTTP/2, permettant le smuggling inter-protocoles.

Outils

  • Burp Request Smuggler – depuis v1.26, il teste automatiquement H2.TE/H2.CL et le support ALPN cachĂ©. Activez "HTTP/2 probing" dans les options de l'extension.
  • h2cSmuggler – PoC Python par Bishop Fox pour automatiser l'attaque de mise Ă  niveau en texte clair :
bash
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
  • curl/hyper – crĂ©ation de charges utiles manuelles : curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target.

Mesures défensives

  1. HTTP/2 de bout en bout – Ă©liminer complĂštement la traduction de rĂ©trogradation.
  2. Source unique de vĂ©ritĂ© sur la longueur – lors de la rĂ©trogradation, gĂ©nĂ©rez toujours un Content-Length valide et supprimez tous les en-tĂȘtes Content-Length/Transfer-Encoding fournis par l'utilisateur.
  3. Normaliser avant le routage – appliquer la sanitation des en-tĂȘtes avant la logique de routage/réécriture.
  4. Isolation de connexion – ne pas rĂ©utiliser les connexions TCP back-end entre les utilisateurs ; "une requĂȘte par connexion" contrecarrerait les exploits basĂ©s sur la file d'attente.
  5. Supprimer Upgrade sauf WebSocket – empĂȘche le tunneling h2c.

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