Entendiendo la Estructura de Peticiones HTTP
Cada petición HTTP está comprendida de dos partes principales: el header y el body.

- Request Line: La primera linea de la petición,
POST /admin/login HTTP/1.1. Consiste de al menos 3 elementos. Primero el método que en este caso esPOST. Es un comando de una palabra que le dice al servidor lo que hacer con el recurso. Segundo va el componente path de la URL para la petición. El path identifica la ruta en el servidor, que en este caso es/admin/login. Por último, la versión de HTTP. - Request Headers: Esta sección contiene metadata sobre la petición, como el tipo de contenido mandado, el formato de respuesta deseado y tokens de autentificación. Es como el sobre de la carta, dando la información del remitente, receptor y la naturaleza del contenido.
- Message Body: Es el contenido real de la petición, El body puede estar vacío para una petición
GETpero tener información en JSON, archivos y demás para una peticiónPOST.
Header Content-Length
El header Content-Length indica el tamaño del body de la petición o la respuesta en bytes. Informa al servidor receptor cuánta información esperar, asegurando que el contenido entero es recibido.
POST /submit HTTP/1.1 Host: good.com Content-Type: application/x-www-form-urlencoded Content-Length: 14 q=smuggledData
Esto significa que la petición o la respuesta contiene 14 bytes de información.
Header Transfer-Encoding
El header Transfer-Encoding es usado para especificar la forma del encoding aplicado al body del mensaje de una petición o respuesta HTTP. Un valor comúnmente usado es chumked, indicando que el mensaje está dividido en varias series de chunks, cada cual precedida de su tamaño en formato hexadecimal. Otros valores posibles son compress, deflate y gzip, cada uno indicando un tipo diferente de encoding.
POST /submit HTTP/1.1 Host: good.com Content-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked b q=smuggledData 0
En este ejemplo, b (en hexadecimal equivalente a 11) especifica el tamaño del siguiente chunk. El chunk q=smuggledData es la información real, seguida por una nueva linea. La petición es terminada con un 0, indicando el final del body.
Cómo Afectan los Headers al Procesado de las Peticiones
Los headers juegan un rol importante en guiar al servidor para procesar peticiones. Esto es porque determina cómo parsear el body de la petición e influenciar comportamientos de cacheo. También pueden afectar a la autentificación, redirección y otras respuestas del servidor.

Manipular headers como Content-Length y Transfer-Encoding puede crear vulnerabilidades. Por ejemplo, si un servidor proxy se confunde por estos headers, puede que no distinga adecuadamente dónde termina una petición y comienza otra.
Origen del HTTP Request Smuggling
HTTP Request Smuggling principalmente ocurre debido a discrepancias en cómo los diferentes servidores interpretan las fronteras HTTP. Por ejemplo:
- Si ambos headers (CL y TE) están presentes, las ambigüedades surgen.
- Algunos componentes priorizan CL y otros TE.
- Esta discrepancia puede llevar a que un componente crea que la petición ha acabado mientras que otro sigue, llevando al contrabando.
Ejemplo: Supón un servidor frontend que usa el header Content-Length para determinar el final de una petición mientras que el backend usa el header Transfer-Encoding. Un atacante puede construir una petición que parezca tener una frontera en el frontend pero otra frontera diferente en el backend. Esto puede llevar a que una petición sea smuggled (contrabandeada) dentro de otra, causando un comportamiento inesperado y potenciales vulnerabilidades.

