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
[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
| Variante | Frontend usa | Backend usa | Cuándo aplica |
|---|---|---|---|
| CL.TE | Content-Length | Transfer-Encoding: chunked | Frontend más viejo, backend moderno |
| TE.CL | Transfer-Encoding: chunked | Content-Length | Frontend moderno, backend más viejo |
| TE.TE | TE con obfuscation | TE standard | Ambos soportan TE pero uno falla con variant |
| H2.CL / H2.TE | HTTP/2 framing | HTTP/1.1 con CL/TE | Frontend H2 downgrade a H1 al origin |
3. CL.TE clásico
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 es0(vacío, fin del body) → consume solo0\r\n\r\n→ la palabraSMUGGLEDqueda en el buffer. - La siguiente request normal del próximo user se concatena con
SMUGGLEDpor delante →SMUGGLEDGET / HTTP/1.1...→ corrupted, o usable como prefix injection.
Detection timing
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
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és0\r\n\r\n→ request termina, todo forward al backend. - Backend lee
Content-Length: 3→ consume solo8\r\n(3 bytes) → el resto (SMUGGLED\r\n0\r\n\r\n) queda en buffer → prepended al siguiente request.
Detection timing
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
Sigue aprendiendo · cuenta gratis
Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.