diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index ca99abb76..61ff7643e 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -2,14 +2,14 @@ {{#include ../../banners/hacktricks-training.md}} -## Listas de palabras y herramientas +## Wordlists & Tools - [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble) -## Encabezados para cambiar la ubicación +## Headers to Change Location -Reescribir **IP de origen**: +Reescribir **fuente IP**: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -26,19 +26,20 @@ Reescribir **IP de origen**: - `True-Client-IP: 127.0.0.1` - `Cluster-Client-IP: 127.0.0.1` - `Via: 1.0 fred, 1.1 127.0.0.1` -- `Connection: close, X-Forwarded-For` (Ver encabezados hop-by-hop) +- `Connection: close, X-Forwarded-For` (Revisar hop-by-hop headers) Reescribir **ubicación**: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -## Encabezados hop-by-hop +## Cabeceras hop-by-hop -Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumido por el proxy que maneja actualmente la solicitud, a diferencia de un encabezado de extremo a extremo. +Una cabecera hop-by-hop es una cabecera diseñada para ser procesada y consumida por el proxy que está manejando actualmente la petición, a diferencia de una cabecera end-to-end. - `Connection: close, X-Forwarded-For` + {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} @@ -48,58 +49,78 @@ Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumi - `Content-Length: 30` - `Transfer-Encoding: chunked` + {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} -## Encabezados de caché +## El header Expect -**Encabezados de caché del servidor**: +Es posible que el cliente envíe la cabecera `Expect: 100-continue` y entonces el servidor responda con `HTTP/1.1 100 Continue` para permitir que el cliente continúe enviando el body de la petición. Sin embargo, a algunos proxies no les gusta esta cabecera. + +Resultados interesantes de `Expect: 100-continue`: +- Enviar una petición HEAD con un body: el servidor no tuvo en cuenta que las peticiones HEAD no llevan body y mantiene la conexión abierta hasta que ocurre un timeout. +- Algunos servidores devolvieron datos extraños: datos aleatorios leídos del socket en la respuesta, claves secretas o incluso permitió que el front-end no eliminara valores de cabeceras. +- También causó una desincronización `0.CL` porque el backend respondió con un 400 en lugar de un 100, pero el proxy front-end estaba preparado para enviar el body de la petición inicial, así que lo envía y el backend lo toma como una nueva petición. +- Enviar una variación como `Expect: y 100-continue` también provocó la desincronización `0.CL`. +- Un error similar donde el backend respondió con un 404 generó una desincronización `CL.0` porque la petición maliciosa indicaba un `Content-Length`, así que el backend envía la petición maliciosa + los bytes del `Content-Length` de la siguiente petición (de una víctima). Esto desincroniza la cola porque el backend envía la respuesta 404 para la petición maliciosa + la respuesta de las peticiones de la víctima, pero el front-end pensó que solo se había enviado 1 petición, por lo que la segunda respuesta se envía a una segunda petición de la víctima y la respuesta de esa se envía a la siguiente... + +Para más información sobre HTTP Request Smuggling consulta: + +{{#ref}} +../../pentesting-web/http-request-smuggling/ +{{#endref}} + + +## Cabeceras de caché + +**Cabeceras de caché del servidor**: + +- **`X-Cache`** en la respuesta puede tener el valor **`miss`** cuando la petición no fue cacheada y el valor **`hit`** cuando sí lo está. +- Comportamiento similar en la cabecera **`Cf-Cache-Status`**. +- **`Cache-Control`** indica si un recurso está siendo cacheado y cuándo será la siguiente vez que el recurso se considere válido: `Cache-Control: public, max-age=1800` +- **`Vary`** se usa a menudo en la respuesta para **indicar cabeceras adicionales** que se tratan como **parte de la clave de caché** aunque normalmente no estén incluidas. +- **`Age`** define los segundos que el objeto ha estado en la caché del proxy. +- **`Server-Timing: cdn-cache; desc=HIT`** también indica que un recurso fue cacheado. -- **`X-Cache`** en la respuesta puede tener el valor **`miss`** cuando la solicitud no fue almacenada en caché y el valor **`hit`** cuando está almacenada en caché -- Comportamiento similar en el encabezado **`Cf-Cache-Status`** -- **`Cache-Control`** indica si un recurso está siendo almacenado en caché y cuándo será la próxima vez que el recurso será almacenado en caché nuevamente: `Cache-Control: public, max-age=1800` -- **`Vary`** se usa a menudo en la respuesta para **indicar encabezados adicionales** que se tratan como **parte de la clave de caché** incluso si normalmente no tienen clave. -- **`Age`** define el tiempo en segundos que el objeto ha estado en la caché del proxy. -- **`Server-Timing: cdn-cache; desc=HIT`** también indica que un recurso fue almacenado en caché {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} -**Encabezados de caché local**: +**Cabeceras de caché local**: -- `Clear-Site-Data`: Encabezado para indicar la caché que debe ser eliminada: `Clear-Site-Data: "cache", "cookies"` -- `Expires`: Contiene la fecha/hora cuando la respuesta debe expirar: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Clear-Site-Data`: Cabecera para indicar qué cachés deben eliminarse: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: Contiene la fecha/hora en la que la respuesta debería expirar: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache` igual que `Cache-Control: no-cache` -- `Warning`: El encabezado HTTP general **`Warning`** contiene información sobre posibles problemas con el estado del mensaje. Puede aparecer más de un encabezado `Warning` en una respuesta. `Warning: 110 anderson/1.3.37 "Response is stale"` +- `Warning`: El encabezado general HTTP **`Warning`** contiene información sobre posibles problemas con el estado del mensaje. Puede aparecer más de una cabecera `Warning` en una respuesta. `Warning: 110 anderson/1.3.37 "Response is stale"` ## Condicionales -- Las solicitudes que utilizan estos encabezados: **`If-Modified-Since`** y **`If-Unmodified-Since`** recibirán respuesta con datos solo si el encabezado de respuesta **`Last-Modified`** contiene un tiempo diferente. -- Las solicitudes condicionales que utilizan **`If-Match`** y **`If-None-Match`** utilizan un valor Etag para que el servidor web envíe el contenido de la respuesta si los datos (Etag) han cambiado. El `Etag` se toma de la respuesta HTTP. -- El valor **Etag** generalmente se **calcula** en función del **contenido** de la respuesta. Por ejemplo, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indica que el `Etag` es el **Sha1** de **37 bytes**. +- Las peticiones que usan estas cabeceras: **`If-Modified-Since`** y **`If-Unmodified-Since`** recibirán datos solo si la cabecera de respuesta **`Last-Modified`** contiene una hora diferente. +- Las peticiones condicionales que usan **`If-Match`** y **`If-None-Match`** usan un valor Etag para que el servidor envíe el contenido de la respuesta si los datos (Etag) han cambiado. El `Etag` se toma de la respuesta HTTP. +- El valor **Etag** suele calcularse en base al **contenido** de la respuesta. Por ejemplo, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indica que el `Etag` es el **Sha1** de **37 bytes**. -## Solicitudes de rango +## Range requests -- **`Accept-Ranges`**: Indica si el servidor admite solicitudes de rango, y si es así, en qué unidad se puede expresar el rango. `Accept-Ranges: ` -- **`Range`**: Indica la parte de un documento que el servidor debe devolver. Por ejemplo, `Range:80-100` devolverá los bytes 80 a 100 de la respuesta original con un código de estado 206 Partial Content. También recuerda eliminar el encabezado `Accept-Encoding` de la solicitud. -- Esto podría ser útil para obtener una respuesta con código javascript reflejado arbitrario que de otro modo podría ser escapado. Pero para abusar de esto necesitarías inyectar estos encabezados en la solicitud. -- **`If-Range`**: Crea una solicitud de rango condicional que solo se cumple si el etag o la fecha dados coinciden con el recurso remoto. Se utiliza para evitar descargar dos rangos de versiones incompatibles del recurso. -- **`Content-Range`**: Indica dónde en un mensaje de cuerpo completo pertenece un mensaje parcial. +- **`Accept-Ranges`**: Indica si el servidor soporta range requests, y si es así en qué unidad puede expresarse el rango. `Accept-Ranges: ` +- **`Range`**: Indica la parte de un documento que el servidor debe devolver. Por ejemplo, `Range:80-100` devolverá los bytes 80 a 100 de la respuesta original con un código 206 Partial Content. También recuerda eliminar la cabecera `Accept-Encoding` de la petición. +- Esto puede ser útil para obtener una respuesta con código JavaScript reflejado arbitrario que de otro modo podría ser escapado. Pero para abusar de esto necesitarías inyectar estas cabeceras en la petición. +- **`If-Range`**: Crea una petición de rango condicional que solo se cumplirá si el etag o la fecha proporcionados coinciden con el recurso remoto. Usado para evitar descargar dos rangos de versiones incompatibles del recurso. +- **`Content-Range`**: Indica dónde pertenece un mensaje parcial dentro de un mensaje de cuerpo completo. ## Información del cuerpo del mensaje - **`Content-Length`:** El tamaño del recurso, en número decimal de bytes. -- **`Content-Type`**: Indica el tipo de medio del recurso -- **`Content-Encoding`**: Se utiliza para especificar el algoritmo de compresión. -- **`Content-Language`**: Describe el/los idioma(s) humano(s) destinados a la audiencia, de modo que permite a un usuario diferenciar según el idioma preferido del usuario. +- **`Content-Type`**: Indica el tipo de medio del recurso. +- **`Content-Encoding`**: Usado para especificar el algoritmo de compresión. +- **`Content-Language`**: Describe el(los) idioma(s) humano(s) destinados a la audiencia, permitiendo diferenciar según el idioma preferido del usuario. - **`Content-Location`**: Indica una ubicación alternativa para los datos devueltos. -Desde el punto de vista de un pentest, esta información suele ser "inútil", pero si el recurso está **protegido** por un 401 o 403 y puedes encontrar alguna **manera** de **obtener** esta **info**, esto podría ser **interesante.**\ -Por ejemplo, una combinación de **`Range`** y **`Etag`** en una solicitud HEAD puede filtrar el contenido de la página a través de solicitudes HEAD: +Desde un punto de vista pentest esta información suele ser "inútil", pero si el recurso está **protegido** por un 401 o 403 y puedes encontrar alguna **manera** de **obtener** esta **info**, esto podría ser **interesante.**\ +Por ejemplo, una combinación de **`Range`** y **`Etag`** en una petición HEAD puede leak el contenido de la página vía peticiones HEAD: -- Una solicitud con el encabezado `Range: bytes=20-20` y con una respuesta que contiene `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` está filtrando que el SHA1 del byte 20 es `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` +- Una petición con la cabecera `Range: bytes=20-20` y con una respuesta que contiene `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` está leakando que el SHA1 del byte 20 es `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ## Información del servidor @@ -108,28 +129,29 @@ Por ejemplo, una combinación de **`Range`** y **`Etag`** en una solicitud HEAD ## Controles -- **`Allow`**: Este encabezado se utiliza para comunicar los métodos HTTP que un recurso puede manejar. Por ejemplo, podría especificarse como `Allow: GET, POST, HEAD`, indicando que el recurso admite estos métodos. -- **`Expect`**: Utilizado por el cliente para transmitir expectativas que el servidor necesita cumplir para que la solicitud se procese con éxito. Un caso de uso común implica el encabezado `Expect: 100-continue`, que señala que el cliente tiene la intención de enviar una carga de datos grande. El cliente busca una respuesta `100 (Continue)` antes de proceder con la transmisión. Este mecanismo ayuda a optimizar el uso de la red al esperar la confirmación del servidor. +- **`Allow`**: Esta cabecera se usa para comunicar los métodos HTTP que un recurso puede manejar. Por ejemplo, puede especificarse como `Allow: GET, POST, HEAD`, indicando que el recurso soporta esos métodos. +- **`Expect`**: Utilizado por el cliente para transmitir expectativas que el servidor debe cumplir para que la petición sea procesada con éxito. Un caso común es la cabecera `Expect: 100-continue`, que indica que el cliente pretende enviar una carga de datos grande. El cliente espera una respuesta `100 (Continue)` antes de proceder con la transmisión. Este mecanismo ayuda a optimizar el uso de la red esperando la confirmación del servidor. ## Descargas -- El encabezado **`Content-Disposition`** en las respuestas HTTP indica si un archivo debe ser mostrado **inline** (dentro de la página web) o tratado como un **adjunto** (descargado). Por ejemplo: +- La cabecera **`Content-Disposition`** en respuestas HTTP indica si un archivo debe mostrarse **inline** (dentro de la página web) o tratarse como un **attachment** (descargado). Por ejemplo: ``` Content-Disposition: attachment; filename="filename.jpg" ``` Esto significa que el archivo llamado "filename.jpg" está destinado a ser descargado y guardado. -## Encabezados de Seguridad +## Encabezados de seguridad + +### Content Security Policy (CSP) -### Política de Seguridad de Contenido (CSP) {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Tipos de Confianza** +### **Trusted Types** -Al hacer cumplir los Tipos de Confianza a través de CSP, las aplicaciones pueden protegerse contra ataques XSS en el DOM. Los Tipos de Confianza aseguran que solo se puedan utilizar objetos específicamente diseñados, que cumplan con las políticas de seguridad establecidas, en llamadas a API web peligrosas, asegurando así el código JavaScript por defecto. +Al aplicar Trusted Types mediante CSP, las aplicaciones pueden protegerse contra ataques DOM XSS. Trusted Types garantizan que solo objetos específicamente creados, conformes con políticas de seguridad establecidas, puedan utilizarse en llamadas a APIs web peligrosas, asegurando así el código JavaScript por defecto. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -148,74 +170,75 @@ el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** -Este encabezado previene la detección de tipos MIME, una práctica que podría llevar a vulnerabilidades XSS. Asegura que los navegadores respeten los tipos MIME especificados por el servidor. +Este header previene MIME type sniffing, una práctica que podría conducir a vulnerabilidades XSS. Garantiza que los navegadores respeten los MIME types especificados por el servidor. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Para combatir el clickjacking, este encabezado restringe cómo se pueden incrustar documentos en las etiquetas ``, `