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
- 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.
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
- 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.
- 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.
- L'Ă©tape de traduction doit crĂ©er Ă la fois des en-tĂȘtes
Content-Length
et/ouTransfer-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
Variante | Longueur front-end | Longueur back-end | Charge utile typique |
---|---|---|---|
H2.TE | Trame HTTP/2 | Transfer-Encoding: chunked | IntĂ©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.CL | Trame HTTP/2 | Content-Length | Envoyer 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
- Utilisez ALPN dans une poignée de main TLS (
openssl s_client -alpn h2 -connect host:443
) ou curl :
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)
: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
- 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. - 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 âŠ
). - 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 sessionGET /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
etUpgrade: 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 :
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
- HTTP/2 de bout en bout â Ă©liminer complĂštement la traduction de rĂ©trogradation.
- 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ĂȘtesContent-Length
/Transfer-Encoding
fournis par l'utilisateur. - Normaliser avant le routage â appliquer la sanitation des en-tĂȘtes avant la logique de routage/réécriture.
- 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.
- Supprimer
Upgrade
sauf WebSocket â empĂȘche le tunneling h2c.
Références
- PortSwigger Research â âHTTP/2: The Sequel is Always Worseâ https://portswigger.net/research/http2
- Bishop Fox â âh2c Smuggling: request smuggling via HTTP/2 clear-textâ https://bishopfox.com/blog/h2c-smuggling-request
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.