hacktricks/network-services-pentesting/pentesting-web/special-http-headers.md

212 lines
12 KiB
Markdown
Raw Normal View History

# Encabezados HTTP especiales
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
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 el [**oficial PEASS & HackTricks swag**](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íguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>
## Listas de palabras y herramientas
* [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
2023-06-05 18:33:24 +00:00
Reescribir **IP de origen**:
2023-06-05 18:33:24 +00:00
* `X-Originating-IP: 127.0.0.1`
* `X-Forwarded-For: 127.0.0.1`
* `X-Forwarded: 127.0.0.1`
* `Forwarded-For: 127.0.0.1`
* `X-Forwarded-Host: 127.0.0.1`
* `X-Remote-IP: 127.0.0.1`
* `X-Remote-Addr: 127.0.0.1`
* `X-ProxyUser-Ip: 127.0.0.1`
* `X-Original-URL: 127.0.0.1`
* `Client-IP: 127.0.0.1`
* `X-Client-IP: 127.0.0.1`
* `X-Host: 127.0.0.1`
* `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` (Verificar encabezados hop-by-hop)
2023-06-05 18:33:24 +00:00
Reescribir **ubicación**:
* `X-Original-URL: /admin/console`
* `X-Rewrite-URL: /admin/console`
## Encabezados hop-by-hop
2023-06-05 18:33:24 +00:00
Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumido por el proxy que maneja actualmente la solicitud, en lugar de un encabezado de extremo a extremo.
2023-06-05 18:33:24 +00:00
* `Connection: close, X-Forwarded-For`
{% content-ref url="../../pentesting-web/abusing-hop-by-hop-headers.md" %}
[abusing-hop-by-hop-headers.md](../../pentesting-web/abusing-hop-by-hop-headers.md)
{% endcontent-ref %}
## Contrabando de solicitudes HTTP
2023-06-05 18:33:24 +00:00
* `Content-Length: 30`
* `Transfer-Encoding: chunked`
{% content-ref url="../../pentesting-web/http-request-smuggling/" %}
[http-request-smuggling](../../pentesting-web/http-request-smuggling/)
{% endcontent-ref %}
## Encabezados de caché
2023-06-05 18:33:24 +00:00
**Encabezados de caché del servidor**:
2023-06-05 18:33:24 +00:00
* **`X-Cache`** en la respuesta puede tener el valor **`miss`** cuando la solicitud no estaba en caché y el valor **`hit`** cuando está 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 se almacene 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 los tiempos 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é
2023-06-05 18:33:24 +00:00
{% content-ref url="../../pentesting-web/cache-deception/" %}
[cache-deception](../../pentesting-web/cache-deception/)
2023-06-05 18:33:24 +00:00
{% endcontent-ref %}
**Encabezados de caché local**:
* `Clear-Site-Data`: Encabezado para indicar la caché que debe eliminarse: `Clear-Site-Data: "cache", "cookies"`
* `Expires`: Contiene la fecha/hora en que la respuesta debe expirar: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
* `Pragma: no-cache` igual que `Cache-Control: no-cache`
* `Warning`: El encabezado general **`Warning`** de HTTP contiene información sobre posibles problemas con el estado del mensaje. Pueden aparecer más de un encabezado `Warning` en una respuesta. `Warning: 110 anderson/1.3.37 "Response is stale"`
## Condiciones
* Las solicitudes que utilizan estos encabezados: **`If-Modified-Since`** y **`If-Unmodified-Since`** responderán 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** suele ser **calculado 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
* **`Accept-Ranges`**: Indica si el servidor admite solicitudes de rango, y en qué unidad se puede expresar el rango. `Accept-Ranges: <unidad-de-rango>`
* **`Range`**: Indica la parte de un documento que el servidor debe devolver.
* **`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 la descarga de dos rangos de una versión incompatible del recurso.
* **`Content-Range`**: Indica dónde en un mensaje de cuerpo completo pertenece un mensaje parcial.
## 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 idioma(s) humano(s) previsto(s) para la audiencia, permitiendo que un usuario diferencie según el idioma preferido por los usuarios.
* **`Content-Location`**: Indica una ubicación alternativa para los datos devueltos.
Desde el punto de vista de una prueba de penetración, esta información suele ser "inútil", pero si el recurso está **protegido** por un 401 o 403 y puedes encontrar alguna **forma** de **obtener** esta **información**, 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:
* 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`
## Información del Servidor
* `Server: Apache/2.4.1 (Unix)`
* `X-Powered-By: PHP/5.3.3`
## 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 debe cumplir para que la solicitud se procese correctamente. Un caso de uso común implica el encabezado `Expect: 100-continue`, que indica que el cliente tiene la intención de enviar una carga útil de datos grande. El cliente espera una respuesta `100 (Continue)` antes de continuar con la transmisión. Este mecanismo ayuda a optimizar el uso de la red al esperar la confirmación del servidor.
## Descargas
* El encabezado **`Content-Disposition`** en las respuestas HTTP indica si un archivo debe mostrarse **en línea** (dentro de la página web) o tratarse como un **archivo adjunto** (descargado). Por ejemplo:
```
Content-Disposition: attachment; filename="filename.jpg"
2023-06-05 18:33:24 +00:00
```
Esto significa que el archivo llamado "filename.jpg" está destinado a ser descargado y guardado.
## Encabezados de Seguridad
2023-06-05 18:33:24 +00:00
### Política de Seguridad de Contenido (CSP) <a href="#csp" id="csp"></a>
{% content-ref url="../../pentesting-web/content-security-policy-csp-bypass/" %}
[content-security-policy-csp-bypass](../../pentesting-web/content-security-policy-csp-bypass/)
{% endcontent-ref %}
### **Tipos de Confianza**
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 garantizan que solo objetos específicamente diseñados, conformes con las políticas de seguridad establecidas, puedan ser utilizados en llamadas peligrosas a API web, asegurando así el código JavaScript de forma predeterminada.
2023-06-05 18:33:24 +00:00
```javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '&lt;').replace(/>/g, '&gt;');
});
2023-06-05 18:33:24 +00:00
}
```
```javascript
// Assignment of raw strings is blocked, ensuring safety.
el.innerHTML = 'some string'; // Throws an exception.
2023-06-05 18:33:24 +00:00
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
el.innerHTML = escaped; // Results in safe assignment.
2023-06-05 18:33:24 +00:00
```
### **X-Content-Type-Options**
2023-06-05 18:33:24 +00:00
Este encabezado previene el MIME type sniffing, una práctica que podría llevar a vulnerabilidades XSS. Asegura que los navegadores respeten los MIME types especificados por el servidor.
```
2023-06-05 18:33:24 +00:00
X-Content-Type-Options: nosniff
```
### **X-Frame-Options**
2023-06-05 18:33:24 +00:00
Para combatir el clickjacking, este encabezado restringe cómo se pueden incrustar documentos en etiquetas `<frame>`, `<iframe>`, `<embed>`, o `<object>`, recomendando que todos los documentos especifiquen explícitamente sus permisos de incrustación.
```
2023-06-05 18:33:24 +00:00
X-Frame-Options: DENY
```
### **Política de Recursos de Origen Cruzado (CORP) y Compartir Recursos de Origen Cruzado (CORS)**
2023-06-05 18:33:24 +00:00
CORP es crucial para especificar qué recursos pueden ser cargados por sitios web, mitigando fugas entre sitios. CORS, por otro lado, permite un mecanismo más flexible de compartir recursos de origen cruzado, relajando la política de misma origen bajo ciertas condiciones.
2023-06-05 18:33:24 +00:00
```
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
```
### **Política de incrustación de origen cruzado (COEP) y Política de apertura de origen cruzado (COOP)**
2023-06-05 18:33:24 +00:00
COEP y COOP son esenciales para habilitar el aislamiento de origen cruzado, reduciendo significativamente el riesgo de ataques similares a Spectre. Controlan la carga de recursos de origen cruzado y la interacción con ventanas de origen cruzado, respectivamente.
```
2023-06-05 18:33:24 +00:00
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
2023-06-05 18:33:24 +00:00
```
### **HTTP Strict Transport Security (HSTS)**
2023-06-05 18:33:24 +00:00
Por último, HSTS es una característica de seguridad que obliga a los navegadores a comunicarse solo con servidores a través de conexiones seguras HTTPS, mejorando así la privacidad y la seguridad.
```
2023-06-05 18:33:24 +00:00
Strict-Transport-Security: max-age=3153600
```
## Referencias
2023-06-05 18:33:24 +00:00
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
2023-06-05 18:33:24 +00:00
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
* [https://web.dev/security-headers/](https://web.dev/security-headers/)
* [https://web.dev/articles/security-headers](https://web.dev/articles/security-headers)
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* 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 el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
2023-06-05 18:33:24 +00:00
* Descubre [**The PEASS Family**](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íguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **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).
2023-06-05 18:33:24 +00:00
</details>