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.
La checklist que repaso en cada objetivo nuevo
47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.
Te das de baja en un clic, desde cualquier correo.
Practica esto en un lab
Http Request Smuggling
Sigue aprendiendo · cuenta gratis
Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.
