Je teste une application Web et j'ai trouvé une fonction de redirection qui semble peu sécurisée. Si je visite une page inexistante, je suis redirigé vers la page de connexion de l'application. Cependant, la fonction de redirection peut être exploitée en définissant un en-tête d'hôte personnalisé:
GET /temp/temp/nonexisting HTTP/1.1
Host: www.someevilsite.com
Le serveur qui répond avec:
HTTP/1.1 302 Found
...
location: www.someevilsite.com/login
Et me redirige simplement vers la page du mal. S'il est possible de falsifier l'en-tête de l'hôte d'un utilisateur distant et de le faire cliquer sur une URL personnalisée, l'utilisateur peut être redirigé vers une page malveillante et potentiellement se faire voler son mot de passe.
Cependant, je n'arrive pas à trouver un scénario dans lequel je puisse compromettre l'en-tête Host de l'utilisateur. Existe-t-il des moyens de manipuler l'en-tête Host de l'utilisateur, étant donné que le site Web est sur HTTP?
C'est une vieille question, mais par souci d'exhaustivité, je vais ajouter quelques réflexions.
La référence en terme d'attaque des en-têtes d'hôtes est Attaques d'en-tête d'hôte pratiques (2013) et est toujours valide.
Les attaquants utiliseraient certainement l'astuce absolu-uri pour injecter le mauvais en-tête et être sûr d'atteindre le bon hôte virtuel. Mais dans certains cas, cela n'est même pas requis (comme cela peut être dans votre application actuelle, où toute demande avec un en-tête Host est acceptée étant donné que le HTTP la requête est faite sur la bonne IP)
# instead of
GET /uri HTTP/1.1
Host: good.name.com
# they would use
GET http://good.name.com/uri HTTP/1.1
Host: evil.com
Et cela pourrait être exploité principalement de 3 façons (principalement, mais c'est ouvert à plus d'idées):
/uri
. Assez difficile à réaliser (le cache peut finir par mettre en cache la page en tant que http://good.name.com/uri
et pas /uri
.CRLF
, ou %0a%D
, c'est "\ r\n") serait réutilisé sans filtrage sur les en-têtes de réponse. Menant à l'injection d'en-têtes dans la réponse.Comme l'a noté @Steffen Ullrich, il n'y a aucun moyen de conduire un utilisateur innocent à effectuer l'attaque (en particulier parce que le navigateur utilise la résolution DNS du nom d'hôte pour trouver l'IP du serveur Web). Donc la seule victime semble pour être l'attaquant . Mais de toute façon, la cible d'attaque est asynchrone. Ce n'est pas comme une attaque XSS, la cible n'est pas l'utilisateur qui reçoit la réponse. Dans l'empoisonnement du cache, c'est assez évident (la cible est le cache), dans le courrier électronique de réinitialisation du mot de passe est utilisé pour porter l'attaque à la victime, et dans l'injection CRLF, nous entrons le fractionnement de la réponse HTTP et Zone de contrebande HTTP , où les conséquences sont assez délicates, mais elles peuvent entraîner un empoisonnement du cache, un déni de service, un empoisonnement de socket, incomplet requêtes, etc. La cible est un proxy inverse, et l'attaque sera ensuite étendue à d'autres utilisateurs via ce proxy.
Vous ne pouvez pas envoyer d'en-tête d'hôte personnalisé à partir du navigateur, ce qui signifie que vous ne pouvez pas l'exploiter en utilisant un navigateur seul. Et, puisque HTTPS est utilisé, vous ne pouvez pas monter un homme dans l'attaque du milieu pour modifier l'en-tête Host d'une demande existante. Mais même si HTTPS ne serait pas utilisé, vous ne gagnez vraiment rien de nouveau en modifiant l'en-tête Host dans la demande, car en tant qu'homme au milieu, vous pouvez déjà modifier l'en-tête Location dans la réponse de toute façon.
En résumé, je doute que le problème que vous avez trouvé puisse être utilisé pour quelque chose de malveillant, du moins pas lorsque vous utilisez le navigateur en tant que client.