Injection d’en-tête hôte
L'e-mail de réinitialisation est réel. Le lien qu’il contient n’est pas le vôtre.
Qu'est-ce que Injection d’en-tête hôte?
Les applications créent des liens de réinitialisation de mot de passe à partir de l'en-tête Host ou X-Forwarded-Host de la requête entrante, ce qui permet au demandeur de décider où ils pointent. Vous allez reconstruire une demande de réinitialisation avec un domaine similaire dans X-Forwarded-Host , laisser l'application envoyer un véritable jeton sur votre lien et le rejouer au cours de sa durée de vie pour devenir propriétaire du compte. Ensuite, vous créez l'URL de base à partir d'un APP_BASE_URL configuré plutôt que de demander des données, soutenues par une liste d'autorisation d'hôte au niveau du proxy. La même forme se cache dans les URL de téléchargement signées et les clés de cache.
Ce que vous apprendrez dans Injection d’en-tête hôte
- Reconnaissez <code>req.headers.host</code> comme entrée non fiable, l'en-tête identifie la déclaration du demandeur sur l'endroit où il a envoyé la demande, et non l'identité de l'application.
- Appliquez le correctif constant configuré : créez des URL à partir de <code>process.env.APP_BASE_URL</code> (définies par environnement dans la configuration de déploiement), jamais à partir de valeurs dérivées de la demande.
- Associez-le à une liste autorisée stricte d'en-tête d'hôte au niveau du framework ou du proxy afin que tout autre site d'appel lisant encore l'en-tête soit renforcé
- Auditez chaque site de création d'URL (modèles d'e-mail, URL de téléchargement signées, redirections, clés de cache, pieds de page d'e-mail) pour le même anti-modèle
- Internaliser : un attaquant contrôle les en-têtes de requête, un opérateur contrôle la configuration du déploiement, les bases d'URL sensibles à la sécurité appartiennent du côté opérateur de cette ligne.
Injection d’en-tête hôte — Étapes de la formation
-
Utilisez la fonction de réinitialisation
Bob est après les comptes Verdanta. Il s'agit d'une application de finances personnelles, donc chaque compte qu'il prend en charge est directement lié aux soldes bancaires réels de quelqu'un. Il ne connaît le mot de passe de personne, alors il commence là où il n'en a pas besoin : la page de mot de passe oublié. Il le soumet d’abord avec sa propre adresse jetable, afin de pouvoir voir exactement la demande formulée par la page.
-
Trouver le point final
La demande a été envoyée et le navigateur l'a enregistrée. Bob ouvre le panneau Réseau pour lire où la page l'a réellement envoyé.
-
Lire le schéma corporel
Une demande, et elle dit à Bob tout ce dont il a besoin. Il vérifie ce que la page a mis dans le corps de la requête.
-
Forger la demande de réinitialisation
Bob reconstruit cette même requête dans API Tester, où il peut ajouter une chose qu'un formulaire de navigateur ne lui permet jamais de définir : un en-tête d'hôte falsifié. Il demande une réinitialisation du compte réel d'Alice mais indique à l'application que la demande est arrivée à account-verdanta.app, un domaine similaire qu'il a enregistré et qu'il contrôle (notez le .app, où le vrai site de Verdanta est account.verdanta.com). Si l'application crée le lien de réinitialisation à partir de l'en-tête, l'e-mail d'Alice contiendra son domaine et son véritable jeton.
-
La réponse ne révèle rien
L'API répond par un simple 200 et un message générique. Rien dans la réponse n'indique que quelque chose s'est mal passé, c'est exactement pourquoi ce bug est silencieux. Les dégâts ne résident pas dans la réponse que Bob peut voir. Il se trouve dans l'e-mail qui se trouve désormais dans la boîte de réception d'Alice, contenant un lien qui commence par son domaine.
-
Un e-mail de réinitialisation du mot de passe
En dehors de l'horloge, Alice reçoit un e-mail de réinitialisation de mot de passe de Verdanta. Elle n’en a pas demandé, mais il ressemble exactement au vrai : même expéditeur, même formulation, même mise en page.
-
Cliquez sur le lien de réinitialisation
Alice clique sur le lien pour réinitialiser son mot de passe, exactement comme n'importe qui le ferait.
-
Regardez la barre d'adresse
La page de réinitialisation s'ouvre. Cela ressemble à Verdanta, mais la barre d'adresse raconte une autre histoire.
-
Attrapez le jeton
Le clic d'Alice n'a jamais atteint Verdanta. Son navigateur a ouvert account-verdanta.app, le serveur que Bob contrôle et le jeton de réinitialisation figurait dans l'URL. De retour sur sa propre machine, Bob suit le journal d'accès de ce serveur pour récupérer ce qui vient d'arriver.
-
Rejouer le jeton
Le jeton appartient à Alice, mais il est maintenant entre les mains de Bob, et les jetons de réinitialisation ne se soucient pas de savoir qui les présente. Avant son expiration, il le rejoue sur le véritable point de terminaison et définit un mot de passe de son choix.
Couverture des référentiels de sécurité
OWASP Top 10
- A02:2025 Security Misconfiguration
- A05:2021 Security Misconfiguration
CWE
- CWE-644 Improper Neutralization of HTTP Headers for Scripting Syntax
- CWE-640 Weak Password Recovery Mechanism for Forgotten Password
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security