HTTP Request Smuggling
El HTTP Request Smuggling aprovecha que dos servidores en cadena (un front-end o proxy y el back-end) interpretan de forma distinta dónde acaba una petición. Si consiguen desincronizarse, parte de nuestra petición se "cuela" al principio de la siguiente petición de otro usuario, lo que permite saltarse controles del front-end, envenenar respuestas o secuestrar sesiones ajenas.
El desacuerdo nace de dos cabeceras que indican la longitud del cuerpo: Content-Length (CL) y Transfer-Encoding: chunked (TE). Cuando una petición lleva las dos y cada servidor prioriza una distinta, aparece el desync. Las tres variantes clásicas:
CL.TE (el front-end usa Content-Length, el back-end usa Transfer-Encoding):
POST / HTTP/1.1
Host: victima
Content-Length: 6
Transfer-Encoding: chunked
0
GEl back-end ve el 0 como fin del chunk y deja G en el buffer, que se pega al inicio de la siguiente petición (GET).
TE.CL (al revés): se envía un cuerpo chunked cuya cola queda huérfana para el front-end.
POST / HTTP/1.1
Host: victima
Content-Length: 4
Transfer-Encoding: chunked
5c
GPOST /admin HTTP/1.1
Host: victima
0TE.TE: ambos soportan Transfer-Encoding, pero uno se puede ofuscar para que solo lo respete uno (Transfer-Encoding: xchunked, Transfer-Encoding:\tchunked, doble cabecera, etc.).
Cómo detectarlo. La firma más fiable es de tiempo: una sonda CL.TE/TE.CL mal formada deja al back-end esperando el resto del cuerpo, y esa petición (o la siguiente) tarda varios segundos de más. En el servidor, los indicios son respuestas desemparejadas (un cliente recibe la respuesta de otro), picos de 408 Request Timeout y peticiones con Content-Length y Transfer-Encoding a la vez, que un proxy sano debería rechazar. Burp (extensión HTTP Request Smuggler) automatiza la sonda temporal.
Defensa. Normalizar la petición en el front-end y rechazar las que llevan CL y TE juntas o un TE ambiguo; usar HTTP/2 de extremo a extremo (su longitud es explícita y elimina la ambigüedad); y que el mismo software/versión interprete el framing en toda la cadena. Encadena con envenenamiento de caché y con el robo de peticiones para escalar a secuestro de sesión.