mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 22:20:43 +00:00
214 lines
12 KiB
Markdown
214 lines
12 KiB
Markdown
# Special HTTP headers
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* 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.
|
|
|
|
</details>
|
|
{% 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
|
|
|
|
A hop-by-hop header is a header which is designed to be processed and consumed by the proxy currently handling the request, as opposed to an end-to-end header.
|
|
|
|
* `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
|
|
|
|
**Server Cache Headers**:
|
|
|
|
* **`X-Cache`** nella risposta può avere il valore **`miss`** quando la richiesta non è stata memorizzata nella cache e il valore **`hit`** quando è memorizzata nella cache
|
|
* Comportamento simile nell'intestazione **`Cf-Cache-Status`**
|
|
* **`Cache-Control`** indica se una risorsa è memorizzata nella cache e quando sarà la prossima volta che la risorsa sarà memorizzata di nuovo: `Cache-Control: public, max-age=1800`
|
|
* **`Vary`** è spesso usato nella risposta per **indicare intestazioni aggiuntive** che sono trattate come **parte della chiave della cache** anche se normalmente non sono chiave.
|
|
* **`Age`** definisce il tempo in secondi in cui l'oggetto è stato nella cache del proxy.
|
|
* **`Server-Timing: cdn-cache; desc=HIT`** indica anche che una risorsa è stata memorizzata nella cache
|
|
|
|
{% content-ref url="../../pentesting-web/cache-deception/" %}
|
|
[cache-deception](../../pentesting-web/cache-deception/)
|
|
{% endcontent-ref %}
|
|
|
|
**Local Cache headers**:
|
|
|
|
* `Clear-Site-Data`: Intestazione per indicare la cache che dovrebbe essere rimossa: `Clear-Site-Data: "cache", "cookies"`
|
|
* `Expires`: Contiene la data/ora in cui la risposta dovrebbe scadere: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
|
* `Pragma: no-cache` stesso di `Cache-Control: no-cache`
|
|
* `Warning`: L'**`Warning`** intestazione HTTP generale contiene informazioni su possibili problemi con lo stato del messaggio. Più di un'intestazione `Warning` può apparire in una risposta. `Warning: 110 anderson/1.3.37 "Response is stale"`
|
|
|
|
## Conditionals
|
|
|
|
* Le richieste che utilizzano queste intestazioni: **`If-Modified-Since`** e **`If-Unmodified-Since`** riceveranno una risposta con dati solo se l'intestazione di risposta **`Last-Modified`** contiene un orario diverso.
|
|
* Le richieste condizionali che utilizzano **`If-Match`** e **`If-None-Match`** utilizzano un valore Etag in modo che il server web invii il contenuto della risposta se i dati (Etag) sono cambiati. L'`Etag` è preso dalla risposta HTTP.
|
|
* Il valore **Etag** è solitamente **calcolato** in base al **contenuto** della risposta. Ad esempio, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indica che l'`Etag` è il **Sha1** di **37 byte**.
|
|
|
|
## Range requests
|
|
|
|
* **`Accept-Ranges`**: Indica se il server supporta le richieste di intervallo e, in tal caso, in quale unità l'intervallo può essere espresso. `Accept-Ranges: <range-unit>`
|
|
* **`Range`**: Indica la parte di un documento che il server dovrebbe restituire.
|
|
* **`If-Range`**: Crea una richiesta di intervallo condizionale che viene soddisfatta solo se l'etag o la data forniti corrispondono alla risorsa remota. Utilizzato per prevenire il download di due intervalli da versioni incompatibili della risorsa.
|
|
* **`Content-Range`**: Indica dove in un messaggio a corpo completo appartiene un messaggio parziale.
|
|
|
|
## Message body information
|
|
|
|
* **`Content-Length`:** La dimensione della risorsa, in numero decimale di byte.
|
|
* **`Content-Type`**: Indica il tipo di media della risorsa
|
|
* **`Content-Encoding`**: Utilizzato per specificare l'algoritmo di compressione.
|
|
* **`Content-Language`**: Descrive la lingua umana(i) destinata(e) al pubblico, in modo che consenta a un utente di differenziare in base alla lingua preferita dell'utente.
|
|
* **`Content-Location`**: Indica una posizione alternativa per i dati restituiti.
|
|
|
|
Dal punto di vista di un pentest, queste informazioni sono solitamente "inutili", ma se la risorsa è **protetta** da un 401 o 403 e riesci a trovare un **modo** per **ottenere** queste **info**, questo potrebbe essere **interessante.**\
|
|
Ad esempio, una combinazione di **`Range`** e **`Etag`** in una richiesta HEAD può leakare il contenuto della pagina tramite richieste HEAD:
|
|
|
|
* Una richiesta con l'intestazione `Range: bytes=20-20` e con una risposta contenente `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` sta leakando che il SHA1 del byte 20 è `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
|
|
|
|
## Server Info
|
|
|
|
* `Server: Apache/2.4.1 (Unix)`
|
|
* `X-Powered-By: PHP/5.3.3`
|
|
|
|
## Controls
|
|
|
|
* **`Allow`**: Questa intestazione è utilizzata per comunicare i metodi HTTP che una risorsa può gestire. Ad esempio, potrebbe essere specificato come `Allow: GET, POST, HEAD`, indicando che la risorsa supporta questi metodi.
|
|
* **`Expect`**: Utilizzato dal client per comunicare le aspettative che il server deve soddisfare affinché la richiesta venga elaborata con successo. Un caso d'uso comune coinvolge l'intestazione `Expect: 100-continue`, che segnala che il client intende inviare un grande payload di dati. Il client cerca una risposta `100 (Continue)` prima di procedere con la trasmissione. Questo meccanismo aiuta a ottimizzare l'uso della rete attendendo la conferma del server.
|
|
|
|
## Downloads
|
|
|
|
* L'intestazione **`Content-Disposition`** nelle risposte HTTP indica se un file dovrebbe essere visualizzato **inline** (all'interno della pagina web) o trattato come un **allegato** (scaricato). Per esempio:
|
|
```
|
|
Content-Disposition: attachment; filename="filename.jpg"
|
|
```
|
|
Questo significa che il file chiamato "filename.jpg" è destinato ad essere scaricato e salvato.
|
|
|
|
## Intestazioni di Sicurezza
|
|
|
|
### Content Security Policy (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 %}
|
|
|
|
### **Tipi Fidati**
|
|
|
|
Imponendo i Tipi Fidati tramite CSP, le applicazioni possono essere protette contro attacchi DOM XSS. I Tipi Fidati garantiscono che solo oggetti specificamente progettati, conformi alle politiche di sicurezza stabilite, possano essere utilizzati in chiamate API web pericolose, garantendo così la sicurezza del codice JavaScript per impostazione predefinita.
|
|
```javascript
|
|
// Feature detection
|
|
if (window.trustedTypes && trustedTypes.createPolicy) {
|
|
// Name and create a policy
|
|
const policy = trustedTypes.createPolicy('escapePolicy', {
|
|
createHTML: str => str.replace(/\</g, '<').replace(/>/g, '>');
|
|
});
|
|
}
|
|
```
|
|
|
|
```javascript
|
|
// Assignment of raw strings is blocked, ensuring safety.
|
|
el.innerHTML = 'some string'; // Throws an exception.
|
|
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
|
|
el.innerHTML = escaped; // Results in safe assignment.
|
|
```
|
|
### **X-Content-Type-Options**
|
|
|
|
Questo header previene il MIME type sniffing, una pratica che potrebbe portare a vulnerabilità XSS. Garantisce che i browser rispettino i tipi MIME specificati dal server.
|
|
```
|
|
X-Content-Type-Options: nosniff
|
|
```
|
|
### **X-Frame-Options**
|
|
|
|
Per combattere il clickjacking, questo header limita come i documenti possono essere incorporati nei tag `<frame>`, `<iframe>`, `<embed>` o `<object>`, raccomandando a tutti i documenti di specificare esplicitamente le loro autorizzazioni di incorporamento.
|
|
```
|
|
X-Frame-Options: DENY
|
|
```
|
|
### **Cross-Origin Resource Policy (CORP) e Cross-Origin Resource Sharing (CORS)**
|
|
|
|
CORP è fondamentale per specificare quali risorse possono essere caricate dai siti web, mitigando le perdite cross-site. CORS, d'altra parte, consente un meccanismo di condivisione delle risorse cross-origin più flessibile, allentando la politica di same-origin in determinate condizioni.
|
|
```
|
|
Cross-Origin-Resource-Policy: same-origin
|
|
Access-Control-Allow-Origin: https://example.com
|
|
Access-Control-Allow-Credentials: true
|
|
```
|
|
### **Cross-Origin Embedder Policy (COEP) e Cross-Origin Opener Policy (COOP)**
|
|
|
|
COEP e COOP sono essenziali per abilitare l'isolamento cross-origin, riducendo significativamente il rischio di attacchi simili a Spectre. Controllano il caricamento delle risorse cross-origin e l'interazione con le finestre cross-origin, rispettivamente.
|
|
```
|
|
Cross-Origin-Embedder-Policy: require-corp
|
|
Cross-Origin-Opener-Policy: same-origin-allow-popups
|
|
```
|
|
### **HTTP Strict Transport Security (HSTS)**
|
|
|
|
Infine, HSTS è una funzione di sicurezza che costringe i browser a comunicare con i server solo tramite connessioni HTTPS sicure, migliorando così la privacy e la sicurezza.
|
|
```
|
|
Strict-Transport-Security: max-age=3153600
|
|
```
|
|
## Riferimenti
|
|
|
|
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
|
|
* [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)
|
|
|
|
{% hint style="success" %}
|
|
Impara e pratica AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Impara e pratica GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Supporta HackTricks</summary>
|
|
|
|
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
|
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos github.
|
|
|
|
</details>
|
|
{% endhint %}
|