Web Security Academy

HTTP Host header attacks - Lab : Password reset poisoning via dangling markup

Objectif :

  • Accéder au compte de l'utilisateur Carlos. L'identifiant et le mot de passe d'un autre compte sur le site sont donnés : wiener / peter. Les emails reçus sur ce compte sont consultables via un client mail.

  • Le panel d'administration d'un serveur distant est mis à disposition pour analyser les requêtes qu'il reçoit.

Solution :

On lance le lab et on se retrouve dans un blog :

On clique sur "Login" pour accéder à la page de connexion et on constate qu'un système de récupération de mot de passe oublié est disponible à partir du bouton "Forgot password" :

On accède à cette section et il nous demande de rentrer un nom de compte ou une adresse mail :

On va écrire le nom de compte de celui donnée dans l'énoncé ( Wiener ) pour analyser le fonctionnement d'une récupération de mot de passe. On clique sur "Submit" et un message nous indique qu'il faut vérifier le mail reçu.

Si on analyse la requête envoyée au serveur, on constate que l'entête Host est défini :

On accède au mail du compte et effectivement, on a reçu un message nous indiquant le nouveau mot de passe du compte :

Le mail est vérifié par le scanner d'antivirus MacCarthy Email Security.

Si on analyse plus en détail le code HTML du mail, constate que l'hyperlien donné pour se loguer avec le nouveau mot de passe semble utiliser l'entête Host pour définir l'attribut href :

À la suite de l'hyperlien, le nouveau mot de passe est écrit dans une autre balise HTML.

On va donc tenter une dangling markup injection à partir de l'entête Host pour récupérer le nouveau mot de passe de Carlos que l'on va générer en inscrivant son pseudo dans la page liée aux mots de passe oubliés.

On revient sur la page de régénération de mot de passe et on inscrit maintenant le pseudo Carlos. On intercepte la requête envoyée au serveur et on ajoute un hyperlien à la suite du contenu de l'entête Host vers un serveur distant dont on a le contrôle sans fermer la chaîne de caractères de l'attribut href :

C'est la suite du code HTML du mail qui va fermer cette chaîne de caractères à notre place. Ce qui va nous permettre d'inclure le nouveau mot de passe de Carlos en tant que paramètre GET de la requête qui va être envoyée ( par le scanner antivirus ) vers notre serveur distant par la visite de l'hyperlien.

On redirige la requête au serveur. L'utilisateur Carlos va alors recevoir un mail contenant son nouveau mot de passe et l'hyperlien que l'on a injecté dans l'entête Host.

Le scanner va visiter cet hyperlien. En analysant les requêtes reçues sur notre serveur distant, on constate que le nouveau mot de passe de Carlos est écrit en tant que valeur d'un paramètre GET :

Il suffit alors de se connecter sur le compte de Carlos avec le nouveau mot de passe et le lab est désormais validé.