# HTTP Response Smuggling / Desync
Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
**La técnica de este post fue tomada del video: [https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)**
## Desincronización de la Cola de Solicitudes HTTP
En primer lugar, esta técnica **abusa de una vulnerabilidad de Desincronización de Solicitudes HTTP**, por lo que necesitas saber qué es:
La **principal** **diferencia** entre esta técnica y una Desincronización de Solicitudes HTTP común es que **en lugar de atacar la solicitud de la víctima agregando un prefijo a la misma**, vamos a **filtrar o modificar la respuesta que recibe la víctima**. Esto se logra enviando 2 solicitudes completas para desincronizar la cola de respuestas de los proxies, en lugar de enviar 1 solicitud y media para abusar de la Desincronización de Solicitudes HTTP.
Esto se debe a que vamos a poder **desincronizar la cola de respuestas** para que la **respuesta** de la **solicitud legítima de la víctima se envíe al atacante**, o **inyectando contenido controlado por el atacante en la respuesta a la víctima**.
### Desincronización de Pipelining HTTP
HTTP/1.1 permite solicitar **diferentes recursos sin necesidad de esperar los anteriores**. Por lo tanto, si hay un **proxy** en el **medio**, es tarea de los proxies **mantener una coincidencia sincronizada de las solicitudes enviadas al backend y las respuestas que provienen de él**.
Sin embargo, hay un problema al desincronizar la cola de respuestas. Si un atacante envía un ataque de Desincronización de Respuestas HTTP y las respuestas a la **solicitud inicial y la solicitada se responden inmediatamente**, la respuesta solicitada no se insertará en la cola de respuestas de la víctima, sino que **se descartará como un error**.
![](<../.gitbook/assets/image (635) (1) (1) (1).png>)
Por lo tanto, es necesario que la **solicitud filtrada** **tome más tiempo en procesarse** dentro del servidor backend. Por lo tanto, cuando la solicitud filtrada se procese, la comunicación con el atacante habrá terminado.
Si en esta situación específica un **atacante envía una solicitud** y la **solicitud filtrada se responde antes** que la solicitud legítima, la **respuesta filtrada se enviará a la víctima**. Por lo tanto, el atacante estará **controlando la solicitud "realizada" por la víctima**.
Además, si el **atacante luego realiza una solicitud** y la **respuesta legítima** a la **solicitud de la víctima se responde** **antes** que la solicitud del atacante. La **respuesta a la víctima se enviará al atacante**, **robando** la respuesta a la víctima (que puede contener, por ejemplo, el encabezado **Set-Cookie**).
![](<../.gitbook/assets/image (658) (1).png>)
![](<../.gitbook/assets/image (655) (1) (1) (1).png>)
### Múltiples Inyecciones Anidadas
Otra **diferencia interesante** con la Desincronización de Solicitudes HTTP común es que, en un ataque de desincronización común, el **objetivo** es **modificar el inicio de la solicitud de la víctima** para que realice una acción inesperada. En un **ataque de desincronización de respuestas HTTP**, al **enviar solicitudes completas**, puedes **inyectar en una carga útil decenas de respuestas** que **desincronizarán a decenas de usuarios** que estarán **recibiendo** las **respuestas** **inyectadas**.
Además de poder **distribuir más fácilmente decenas de exploits** entre usuarios legítimos, esto también podría usarse para causar una **denegación de servicio** en el servidor.
### Organización de Exploits
Como se explicó anteriormente, para abusar de esta técnica, es necesario que el **primer mensaje filtrado** en el servidor **requiera mucho tiempo para procesarse**.
Esta **solicitud que consume tiempo es suficiente** si solo queremos **intentar robar la respuesta de las víctimas**. Pero si deseas realizar un exploit más complejo, esta será una estructura común para el exploit.
Primero la **solicitud inicial** abusando de la **Desincronización de Solicitudes HTTP**, luego la **solicitud que consume tiempo** y luego **1 o más solicitudes de carga útil** cuyas respuestas se enviarán a las víctimas.
## Abusando de la Desincronización de la Cola de Respuestas HTTP
### Capturando las solicitudes de otros usuarios
Al igual que con las cargas útiles conocidas de Desincronización de Solicitudes HTTP, puedes **robar la solicitud de las víctimas** con una diferencia importante: En este caso, solo necesitas que el **contenido enviado se refleje en la respuesta**, **no se necesita almacenamiento persistente**.
Primero, el atacante envía una carga útil que contiene una **solicitud POST final con el parámetro reflejado** al final y un largo Content-Length
![](<../.gitbook/assets/image (625).png>)
Luego, una vez que la **solicitud inicial** (azul) fue **procesada** y **mientras** la **solicitud lenta** se está procesando (amarilla), la **próxima solicitud que llega de una víctima** se va a **agregar en la cola justo después del parámetro reflejado**:
![](<../.gitbook/assets/image (634) (1).png>)
Entonces, la **víctima** **recibirá** la **respuesta a la solicitud lenta** y si en ese momento el **atacante** **envía** **otra** **solicitud**, la **respuesta de la solicitud de contenido reflejado se le enviará**.
## Desincronización de Respuestas
Hasta este punto, hemos aprendido cómo abusar de los ataques de Desincronización de Solicitudes HTTP para **controlar** la **solicitud** **cuya** **respuesta** un **cliente** va a **recibir** y cómo luego puedes **robar la respuesta que estaba destinada a la víctima**.
Pero aún es posible **desincronizar aún más** las respuestas.
Existen solicitudes interesantes como la solicitud **HEAD** que se especifican para no tener **ningún contenido dentro del cuerpo de las respuestas** y que deben (deben) **contener el Content-Length** de la solicitud como **si fuera una solicitud GET**.
Por lo tanto, si un atacante **inyecta** una solicitud **HEAD**, como en estas imágenes:
![](<../.gitbook/assets/image (626).png>)
Entonces, **una vez que la azul es respondida al atacante**, la próxima solicitud de la víctima se introducirá en la cola:
![](<../.gitbook/assets/image (651) (1) (1) (1) (1) (1) (1).png>)
Entonces, la **víctima** **recibirá** la **respuesta** de la **solicitud HEAD**, que **va a contener un Content-Length pero sin contenido alguno**. Por lo tanto, el proxy **no enviará esta respuesta** a la víctima, sino que **esperará** algún **contenido**, que en realidad será **la respuesta a la solicitud amarilla** (también inyectada por el atacante):
![](<../.gitbook/assets/image (627) (1).png>)
### Confusión de Contenido
Siguiendo el ejemplo anterior, sabiendo que puedes **controlar el cuerpo** de la solicitud cuya respuesta va a recibir la víctima y que una **respuesta HEAD** **generalmente contiene en sus encabezados el Content-Type y el Content-Length**, puedes **enviar una solicitud como la siguiente** para **causar XSS** en la víctima sin que la página sea vulnerable a XSS:
![](<../.gitbook/assets/image (654) (1) (1) (1) (1).png>)
### Envenenamiento de Caché
Abusando del ataque de Confusión de Contenido de desincronización de respuestas comentado anteriormente, **si la caché almacena la respuesta a la solicitud realizada por la víctima y esta respuesta es una inyectada que causa un XSS, entonces la caché está envenenada**.
Solicitud maliciosa que contiene la carga útil de XSS:
![](<../.gitbook/assets/image (644) (1).png>)
Respuesta maliciosa a la víctima que contiene el encabezado que indica a la caché que almacene la respuesta:
![](<../.gitbook/assets/image (629) (1).png>)
{% hint style="warning" %}
Ten en cuenta que en este caso, si el **"víctima" es el atacante**, ahora puede realizar **envenenamiento de caché en URLs arbitrarias** ya que puede **controlar la URL que se va a cachear** con la respuesta maliciosa.
{% endhint %}
### Decepción de Caché Web
Este ataque es similar al anterior, pero **en lugar de inyectar una carga útil dentro de la caché, el atacante almacenará información de la víctima dentro de la caché:**
![](<../.gitbook/assets/image (643) (1) (1).png>)
### División de Respuestas
El **objetivo** de este ataque es abusar nuevamente de la **desincronización de respuestas** para **hacer que el proxy envíe una respuesta 100% generada por el atacante**.
Para lograr esto, el atacante necesita encontrar un punto final de la aplicación web que **refleje algunos valores dentro de la respuesta** y **conocer la longitud del contenido de la respuesta HEAD**.
Enviar un **exploit** como:
![](<../.gitbook/assets/image (649) (1) (1) (1).png>)
Después de que la primera solicitud se resuelva y se envíe de vuelta al atacante, la **solicitud de la víctima se agrega a la cola**:
![](<../.gitbook/assets/image (661) (1) (1) (1).png>)
La víctima recibirá como respuesta la **respuesta HEAD + el contenido de la respuesta de la segunda solicitud (que contiene parte de los datos reflejados):**
![](<../.gitbook/assets/image (633) (1).png>)
Sin embargo, observa cómo los **datos reflejados tenían un tamaño de acuerdo con el Content-Length** de la **respuesta HEAD** que **generó una respuesta HTTP válida en la cola de respuestas**.
Por lo tanto, la **próxima solicitud del segundo usuario** recibirá como **respuesta algo completamente creado por el atacante**. Como la respuesta está completamente creada por el atacante, también puede **hacer que el proxy almacene en caché la respuesta**.