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

210 lines
12 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
# En-têtes HTTP spéciaux
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert en équipe rouge AWS de HackTricks)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Autres façons de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
2023-06-03 13:10:46 +00:00
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
2022-04-28 16:01:33 +00:00
</details>
2023-06-03 13:10:46 +00:00
## Listes de mots et outils
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
2023-06-03 13:10:46 +00:00
## En-têtes pour changer l'emplacement
2021-09-19 15:19:00 +00:00
Réécrire **l'IP source** :
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`
2023-06-03 13:10:46 +00:00
* `Connection: close, X-Forwarded-For` (Vérifiez les en-têtes hop-by-hop)
2021-09-19 15:19:00 +00:00
2023-06-03 13:10:46 +00:00
Réécrire **l'emplacement** :
2021-09-19 15:19:00 +00:00
* `X-Original-URL: /admin/console`
* `X-Rewrite-URL: /admin/console`
2023-06-03 13:10:46 +00:00
## En-têtes hop-by-hop
2021-09-19 15:19:00 +00:00
Un en-tête hop-by-hop est un en-tête conçu pour être traité et consommé par le proxy gérant actuellement la requête, par opposition à un en-tête de bout en bout.
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
## Contrebande de requêtes 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
2023-06-03 13:10:46 +00:00
## En-têtes de cache
2021-09-19 15:52:48 +00:00
**En-têtes de cache serveur** :
2021-09-20 13:06:32 +00:00
* **`X-Cache`** dans la réponse peut avoir la valeur **`miss`** lorsque la requête n'était pas mise en cache et la valeur **`hit`** lorsqu'elle est mise en cache
* Comportement similaire dans l'en-tête **`Cf-Cache-Status`**
* **`Cache-Control`** indique si une ressource est mise en cache et quand la prochaine fois la ressource sera mise en cache à nouveau : `Cache-Control: public, max-age=1800`
* **`Vary`** est souvent utilisé dans la réponse pour **indiquer les en-têtes supplémentaires** qui sont traités comme **partie de la clé de cache** même s'ils ne sont normalement pas clés.
* **`Age`** définit les temps en secondes pendant lesquels l'objet a été dans le cache du proxy.
2023-06-03 13:10:46 +00:00
* **`Server-Timing: cdn-cache; desc=HIT`** indique également qu'une ressource a été mise en cache
2021-09-19 15:52:48 +00:00
{% content-ref url="../../pentesting-web/cache-deception/" %}
[cache-deception](../../pentesting-web/cache-deception/)
{% endcontent-ref %}
2021-09-19 15:52:48 +00:00
2023-06-03 13:10:46 +00:00
**En-têtes de cache local** :
* `Clear-Site-Data` : En-tête pour indiquer le cache qui doit être supprimé : `Clear-Site-Data: "cache", "cookies"`
* `Expires` : Contient la date/heure à laquelle la réponse doit expirer : `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
* `Pragma: no-cache` identique à `Cache-Control: no-cache`
* `Warning` : L'en-tête général **`Warning`** contient des informations sur d'éventuels problèmes avec le statut du message. Plus d'un en-tête `Warning` peut apparaître dans une réponse. `Warning: 110 anderson/1.3.37 "Response is stale"`
## Conditionnels
* Les requêtes utilisant ces en-têtes : **`If-Modified-Since`** et **`If-Unmodified-Since`** ne renverront des données que si l'en-tête de réponse **`Last-Modified`** contient une heure différente.
* Les requêtes conditionnelles utilisant **`If-Match`** et **`If-None-Match`** utilisent une valeur Etag afin que le serveur Web envoie le contenu de la réponse si les données (Etag) ont changé. L'`Etag` est extrait de la réponse HTTP.
* La valeur **Etag** est généralement **calculée en fonction** du **contenu** de la réponse. Par exemple, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indique que l'`Etag` est le **Sha1** de **37 octets**.
## Demandes de plage
* **`Accept-Ranges`** : Indique si le serveur prend en charge les demandes de plage, et si c'est le cas, dans quelle unité la plage peut être exprimée. `Accept-Ranges: <unité-de-plage>`
* **`Range`** : Indique la partie d'un document que le serveur doit renvoyer.
* **`If-Range`** : Crée une demande de plage conditionnelle qui n'est satisfaite que si l'etag ou la date donnée correspond à la ressource distante. Utilisé pour empêcher le téléchargement de deux plages à partir de versions incompatibles de la ressource.
* **`Content-Range`** : Indique où dans un message complet le message partiel appartient.
## Informations sur le corps du message
* **`Content-Length`** : La taille de la ressource, en nombre décimal d'octets.
* **`Content-Type`** : Indique le type de média de la ressource
* **`Content-Encoding`** : Utilisé pour spécifier l'algorithme de compression.
* **`Content-Language`** : Décrit la langue(s) humaine(s) destinée(s) au public, permettant ainsi à un utilisateur de différencier selon sa propre langue préférée.
* **`Content-Location`** : Indique un emplacement alternatif pour les données renvoyées.
D'un point de vue de test d'intrusion, ces informations sont généralement "inutiles", mais si la ressource est **protégée** par un 401 ou 403 et que vous pouvez trouver un moyen de **récupérer** ces **informations**, cela pourrait être **intéressant**.\
Par exemple, une combinaison de **`Range`** et **`Etag`** dans une requête HEAD peut divulguer le contenu de la page via des requêtes HEAD :
* Une requête avec l'en-tête `Range: bytes=20-20` et avec une réponse contenant `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y` divulgue que le SHA1 de l'octet 20 est `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
## Informations sur le serveur
* `Server: Apache/2.4.1 (Unix)`
* `X-Powered-By: PHP/5.3.3`
## Contrôles
* **`Allow`**: Cet en-tête est utilisé pour communiquer les méthodes HTTP qu'une ressource peut gérer. Par exemple, il peut être spécifié comme `Allow: GET, POST, HEAD`, indiquant que la ressource prend en charge ces méthodes.
* **`Expect`**: Utilisé par le client pour transmettre les attentes que le serveur doit satisfaire pour que la requête soit traitée avec succès. Un cas d'utilisation courant implique l'en-tête `Expect: 100-continue`, qui indique que le client a l'intention d'envoyer une charge utile de données importante. Le client attend une réponse `100 (Continue)` avant de poursuivre la transmission. Ce mécanisme aide à optimiser l'utilisation du réseau en attendant la confirmation du serveur.
## Téléchargements
* L'en-tête **`Content-Disposition`** dans les réponses HTTP indique si un fichier doit être affiché **en ligne** (dans la page web) ou traité comme une **pièce jointe** (téléchargé). Par exemple:
```
Content-Disposition: attachment; filename="filename.jpg"
```
## En-têtes de sécurité
### Politique de sécurité du contenu (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 %}
### **Types de confiance**
En imposant les Trusted Types via CSP, les applications peuvent être protégées contre les attaques XSS DOM. Les Trusted Types garantissent que seuls des objets spécifiquement conçus, conformes aux politiques de sécurité établies, peuvent être utilisés dans des appels d'API web dangereux, sécurisant ainsi le code JavaScript par défaut.
```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
Ce header empêche le sniffing de type MIME, une pratique qui pourrait entraîner des vulnérabilités XSS. Il garantit que les navigateurs respectent les types MIME spécifiés par le serveur.
```
2021-10-19 22:49:43 +00:00
X-Content-Type-Options: nosniff
```
### **X-Frame-Options**
2021-10-19 22:49:43 +00:00
Pour lutter contre le clickjacking, cet en-tête restreint la manière dont les documents peuvent être intégrés dans les balises `<frame>`, `<iframe>`, `<embed>`, ou `<object>`, recommandant à tous les documents de spécifier explicitement leurs autorisations d'intégration.
```
2021-10-19 22:49:43 +00:00
X-Frame-Options: DENY
```
### **Politique de ressources entre origines (CORP) et partage de ressources entre origines (CORS)**
2021-10-19 22:49:43 +00:00
CORP est crucial pour spécifier quelles ressources peuvent être chargées par les sites web, atténuant les fuites entre sites. CORS, en revanche, permet un mécanisme de partage de ressources entre origines plus flexible, assouplissant la politique de même origine dans certaines conditions.
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
```
### **Cross-Origin Embedder Policy (COEP) and Cross-Origin Opener Policy (COOP)**
2021-10-19 22:49:43 +00:00
COEP et COOP sont essentiels pour activer l'isolation entre les origines, réduisant considérablement le risque d'attaques de type Spectre. Ils contrôlent le chargement des ressources entre les origines et l'interaction avec les fenêtres entre les origines, respectivement.
```
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
Enfin, HSTS est une fonctionnalité de sécurité qui oblige les navigateurs à communiquer uniquement avec les serveurs via des connexions HTTPS sécurisées, améliorant ainsi la confidentialité et la sécurité.
```
2021-10-19 22:49:43 +00:00
Strict-Transport-Security: max-age=3153600
```
## Références
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>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Autres façons de soutenir HackTricks:
2022-04-28 16:01:33 +00:00
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
2023-06-03 13:10:46 +00:00
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
2022-04-28 16:01:33 +00:00
</details>