# Special HTTP headers {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} ## 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) ## Headers to Change Location Rewrite **IP source**: * `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` (Check hop-by-hop headers) Rewrite **location**: * `X-Original-URL: /admin/console` * `X-Rewrite-URL: /admin/console` ## Hop-by-Hop headers Um cabeçalho hop-by-hop é um cabeçalho que é projetado para ser processado e consumido pelo proxy que está lidando com a solicitação, em vez de um cabeçalho de ponta a ponta. * `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 %} ## HTTP Request Smuggling * `Content-Length: 30` * `Transfer-Encoding: chunked` {% content-ref url="../../pentesting-web/http-request-smuggling/" %} [http-request-smuggling](../../pentesting-web/http-request-smuggling/) {% endcontent-ref %} ## Cache Headers **Cabeçalhos de Cache do Servidor**: * **`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á armazenada em cache * Comportamento semelhante no cabeçalho **`Cf-Cache-Status`** * **`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 indexados. * **`Age`** define o tempo em segundos que o objeto esteve no cache do proxy. * **`Server-Timing: cdn-cache; desc=HIT`** também indica que um recurso foi armazenado em cache {% content-ref url="../../pentesting-web/cache-deception/" %} [cache-deception](../../pentesting-web/cache-deception/) {% endcontent-ref %} **Cabeçalhos de Cache Local**: * `Clear-Site-Data`: Cabeçalho para indicar o cache que deve ser removido: `Clear-Site-Data: "cache", "cookies"` * `Expires`: Contém a data/hora quando a resposta deve expirar: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` * `Pragma: no-cache` o mesmo que `Cache-Control: no-cache` * `Warning`: O cabeçalho HTTP 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"` ## Conditionals * 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 web envie o conteúdo da resposta se os dados (Etag) mudaram. 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**. ## Range requests * **`Accept-Ranges`**: Indica se o servidor suporta solicitações de intervalo e, se sim, em qual unidade o intervalo pode ser expresso. `Accept-Ranges: ` * **`Range`**: Indica a parte de um documento que o servidor deve retornar. * **`If-Range`**: Cria uma solicitação de intervalo condicional que só é atendida se o etag ou a data correspondem 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. ## Message body information * **`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 a(s) língua(s) humana(s) destinadas ao público, permitindo que um usuário diferencie de acordo com a própria língua preferida. * **`Content-Location`**: Indica uma localização alternativa para os dados retornados. Do ponto de vista de um pentest, essas informações são geralmente "inúteis", mas se o recurso estiver **protegido** por um 401 ou 403 e você conseguir encontrar alguma **maneira** de **obter** essa **informação**, isso pode 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` ## Server Info * `Server: Apache/2.4.1 (Unix)` * `X-Powered-By: PHP/5.3.3` ## Controls * **`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 um grande payload de dados. 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" ``` Isso significa que o arquivo nomeado "filename.jpg" é destinado a ser baixado e salvo. ## Cabeçalhos de Segurança ### Content Security Policy (CSP) {% 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 impor Tipos Confiáveis através do CSP, as aplicações podem ser protegidas contra ataques XSS no DOM. Tipos Confiáveis garantem que apenas objetos especificamente elaborados, em conformidade com políticas de segurança estabelecidas, possam ser usados em chamadas de API web perigosas, garantindo assim que o código JavaScript esteja seguro por padrão. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { // Name and create a policy const policy = trustedTypes.createPolicy('escapePolicy', { createHTML: str => str.replace(/\/g, '>'); }); } ``` ```javascript // Assignment of raw strings is blocked, ensuring safety. el.innerHTML = 'some string'; // Throws an exception. const escaped = policy.createHTML(''); el.innerHTML = escaped; // Results in safe assignment. ``` ### **X-Content-Type-Options** Este cabeçalho impede a detecção de tipo MIME, uma prática que pode levar a vulnerabilidades XSS. Ele garante que os navegadores respeitem os tipos MIME especificados pelo servidor. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** Para combater clickjacking, este cabeçalho restringe como documentos podem ser incorporados em ``, `