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

210 lines
12 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Cabeçalhos HTTP Especiais
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Outras maneiras de apoiar o HackTricks:
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
2023-06-06 18:56:34 +00:00
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
## Listas de Palavras & Ferramentas
2021-09-19 15:52:48 +00:00
* [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)
2021-09-19 15:52:48 +00:00
## Cabeçalhos para Alterar Localização
2021-09-19 15:19:00 +00:00
Reescrever **IP de origem**:
2021-09-19 15:19:00 +00:00
2022-04-05 22:24:52 +00:00
* `X-Originating-IP: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `X-Forwarded-For: 127.0.0.1`
2022-04-19 22:38:50 +00:00
* `X-Forwarded: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `Forwarded-For: 127.0.0.1`
2021-09-27 10:58:30 +00:00
* `X-Forwarded-Host: 127.0.0.1`
2022-04-05 22:24:52 +00:00
* `X-Remote-IP: 127.0.0.1`
2021-09-19 15:19:00 +00:00
* `X-Remote-Addr: 127.0.0.1`
* `X-ProxyUser-Ip: 127.0.0.1`
* `X-Original-URL: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `Client-IP: 127.0.0.1`
2021-09-27 10:58:30 +00:00
* `X-Client-IP: 127.0.0.1`
* `X-Host: 127.0.0.1`
2021-09-19 15:52:48 +00:00
* `True-Client-IP: 127.0.0.1`
* `Cluster-Client-IP: 127.0.0.1`
2021-09-20 13:06:32 +00:00
* `Via: 1.0 fred, 1.1 127.0.0.1`
* `Connection: close, X-Forwarded-For` (Verifique cabeçalhos hop-by-hop)
2021-09-19 15:19:00 +00:00
Reescrever **localização**:
2021-09-19 15:19:00 +00:00
* `X-Original-URL: /admin/console`
* `X-Rewrite-URL: /admin/console`
## Cabeçalhos Hop-by-Hop
2021-09-19 15:19:00 +00:00
Um cabeçalho hop-by-hop é um cabeçalho projetado para ser processado e consumido pelo proxy que está manipulando a solicitação, em oposição a um cabeçalho end-to-end.
2021-09-19 15:19:00 +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 %}
2021-09-19 15:19:00 +00:00
## Contrabando de Solicitação HTTP
2021-09-19 15:19:00 +00:00
* `Content-Length: 30`
* `Transfer-Encoding: chunked`
2021-11-05 20:59:42 +00:00
{% content-ref url="../../pentesting-web/http-request-smuggling/" %}
[http-request-smuggling](../../pentesting-web/http-request-smuggling/)
{% endcontent-ref %}
2021-09-19 15:19:00 +00:00
## Cabeçalhos de Cache
2021-09-19 15:52:48 +00:00
**Cabeçalhos de Cache do Servidor**:
2021-09-20 13:06:32 +00:00
2023-06-06 18:56:34 +00:00
* **`X-Cache`** na resposta pode ter o valor **`miss`** quando a solicitação não foi armazenada em cache e o valor **`hit`** quando está em cache
* Comportamento semelhante no cabeçalho **`Cf-Cache-Status`**
2023-06-06 18:56:34 +00:00
* **`Cache-Control`** indica se um recurso está sendo armazenado em cache e quando será a próxima vez que o recurso será armazenado em cache novamente: `Cache-Control: public, max-age=1800`
* **`Vary`** é frequentemente usado na resposta para **indicar cabeçalhos adicionais** que são tratados como **parte da chave de cache** mesmo que normalmente não sejam chaveados.
* **`Age`** define o tempo em segundos que o objeto esteve em cache no proxy.
2023-06-06 18:56:34 +00:00
* **`Server-Timing: cdn-cache; desc=HIT`** também indica que um recurso foi armazenado em cache
2021-09-19 15:52:48 +00:00
{% content-ref url="../../pentesting-web/cache-deception.md" %}
[cache-deception.md](../../pentesting-web/cache-deception.md)
{% endcontent-ref %}
2021-09-19 15:52:48 +00:00
**Cabeçalhos de Cache Local**:
2023-06-06 18:56:34 +00:00
* `Clear-Site-Data`: Cabeçalho para indicar o cache que deve ser removido: `Clear-Site-Data: "cache", "cookies"`
* `Expires`: Contém a data/hora em que a resposta deve expirar: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
* `Pragma: no-cache` igual a `Cache-Control: no-cache`
* `Warning`: O cabeçalho geral **`Warning`** contém informações sobre possíveis problemas com o status da mensagem. Mais de um cabeçalho `Warning` pode aparecer em uma resposta. `Warning: 110 anderson/1.3.37 "Response is stale"`
## Condicional
* Solicitações usando esses cabeçalhos: **`If-Modified-Since`** e **`If-Unmodified-Since`** serão respondidas com dados apenas se o cabeçalho de resposta **`Last-Modified`** contiver um horário diferente.
* Solicitações condicionais usando **`If-Match`** e **`If-None-Match`** usam um valor Etag para que o servidor da web envie o conteúdo da resposta se os dados (Etag) tiverem mudado. O `Etag` é retirado da resposta HTTP.
* O valor **Etag** é geralmente **calculado com base** no **conteúdo** da resposta. Por exemplo, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indica que o `Etag` é o **Sha1** de **37 bytes**.
## Solicitações de Intervalo
* **`Accept-Ranges`**: Indica se o servidor suporta solicitações de intervalo e, em caso afirmativo, em qual unidade o intervalo pode ser expresso. `Accept-Ranges: <range-unit>`
* **`Range`**: Indica a parte de um documento que o servidor deve retornar.
* **`If-Range`**: Cria uma solicitação de intervalo condicional que é atendida apenas se o etag ou data fornecida corresponder ao recurso remoto. Usado para evitar o download de dois intervalos de versões incompatíveis do recurso.
* **`Content-Range`**: Indica onde em uma mensagem de corpo completo uma mensagem parcial pertence.
## Informações do Corpo da Mensagem
* **`Content-Length`:** O tamanho do recurso, em número decimal de bytes.
* **`Content-Type`**: Indica o tipo de mídia do recurso
* **`Content-Encoding`**: Usado para especificar o algoritmo de compressão.
* **`Content-Language`**: Descreve o(s) idioma(s) humano(s) destinado(s) ao público, permitindo que um usuário diferencie de acordo com o idioma preferido dos usuários.
* **`Content-Location`**: Indica uma localização alternativa para os dados retornados.
Do ponto de vista de um pentest, essas informações geralmente são "inúteis", mas se o recurso for **protegido** por um 401 ou 403 e você conseguir encontrar alguma **maneira** de **obter** essas **informações**, isso poderia ser **interessante**.\
Por exemplo, uma combinação de **`Range`** e **`Etag`** em uma solicitação HEAD pode vazar o conteúdo da página via solicitações HEAD:
* Uma solicitação com o cabeçalho `Range: bytes=20-20` e com uma resposta contendo `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` está vazando que o SHA1 do byte 20 é `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
## Informações do Servidor
* `Server: Apache/2.4.1 (Unix)`
* `X-Powered-By: PHP/5.3.3`
## Controles
* **`Allow`**: Este cabeçalho é usado para comunicar os métodos HTTP que um recurso pode manipular. Por exemplo, pode ser especificado como `Allow: GET, POST, HEAD`, indicando que o recurso suporta esses métodos.
* **`Expect`**: Utilizado pelo cliente para transmitir expectativas que o servidor precisa atender para que a solicitação seja processada com sucesso. Um caso de uso comum envolve o cabeçalho `Expect: 100-continue`, que sinaliza que o cliente pretende enviar uma carga de dados grande. O cliente aguarda uma resposta `100 (Continue)` antes de prosseguir com a transmissão. Esse mecanismo ajuda a otimizar o uso da rede aguardando a confirmação do servidor.
## Downloads
* O cabeçalho **`Content-Disposition`** nas respostas HTTP direciona se um arquivo deve ser exibido **inline** (dentro da página da web) ou tratado como um **anexo** (baixado). Por exemplo:
```
Content-Disposition: attachment; filename="filename.jpg"
```
## Cabeçalhos de Segurança
### Política de Segurança de Conteúdo (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 Confiáveis**
Ao fazer cumprir Tipos Confiáveis através do CSP, as aplicações podem ser protegidas contra ataques DOM XSS. Os Tipos Confiáveis garantem que apenas objetos especificamente criados, em conformidade com políticas de segurança estabelecidas, possam ser usados em chamadas perigosas de API da web, garantindo assim o código JavaScript por padrão.
```javascript
2021-10-19 22:49:43 +00:00
// 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;');
});
2021-10-19 22:49:43 +00:00
}
```
```javascript
// Assignment of raw strings is blocked, ensuring safety.
el.innerHTML = 'some string'; // Throws an exception.
2021-10-19 22:49:43 +00:00
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
el.innerHTML = escaped; // Results in safe assignment.
2021-10-19 22:49:43 +00:00
```
### **X-Content-Type-Options**
2021-10-19 22:49:43 +00:00
Este cabeçalho previne a detecção de tipo MIME, uma prática que poderia levar a vulnerabilidades de XSS. Ele garante que os navegadores respeitem os tipos MIME especificados pelo servidor.
```
2021-10-19 22:49:43 +00:00
X-Content-Type-Options: nosniff
```
### **X-Frame-Options**
2021-10-19 22:49:43 +00:00
Para combater o clickjacking, este cabeçalho restringe como os documentos podem ser incorporados em tags `<frame>`, `<iframe>`, `<embed>`, ou `<object>`, recomendando que todos os documentos especifiquem explicitamente suas permissões de incorporação.
```
2021-10-19 22:49:43 +00:00
X-Frame-Options: DENY
```
### **Política de Recursos de Origem Cruzada (CORP) e Compartilhamento de Recursos de Origem Cruzada (CORS)**
2021-10-19 22:49:43 +00:00
CORP é crucial para especificar quais recursos podem ser carregados por sites, mitigando vazamentos entre sites. CORS, por outro lado, permite um mecanismo mais flexível de compartilhamento de recursos de origem cruzada, relaxando a política de mesma origem sob certas condições.
2021-10-19 22:49:43 +00:00
```
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
```
### **Política de Incorporação de Origem Cruzada (COEP) e Política de Origem Cruzada do Opener (COOP)**
2021-10-19 22:49:43 +00:00
COEP e COOP são essenciais para habilitar o isolamento de origem cruzada, reduzindo significativamente o risco de ataques semelhantes ao Spectre. Eles controlam o carregamento de recursos de origens cruzadas e a interação com janelas de origens cruzadas, respectivamente.
```
2021-10-19 22:49:43 +00:00
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
2021-10-19 22:49:43 +00:00
```
### **HTTP Strict Transport Security (HSTS)**
2021-10-19 22:49:43 +00:00
Por último, o HSTS é uma funcionalidade de segurança que obriga os navegadores a se comunicarem apenas com servidores por meio de conexões seguras HTTPS, aumentando assim a privacidade e segurança.
```
2021-10-19 22:49:43 +00:00
Strict-Transport-Security: max-age=3153600
```
## Referências
2021-09-19 19:55:40 +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)
2021-09-19 19:55:40 +00:00
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
2021-10-19 22:49:43 +00:00
* [https://web.dev/security-headers/](https://web.dev/security-headers/)
* [https://web.dev/articles/security-headers](https://web.dev/articles/security-headers)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
2022-04-28 16:01:33 +00:00
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
2023-06-06 18:56:34 +00:00
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
2022-04-28 16:01:33 +00:00
</details>