web-dev-qa-db-fra.com

Un site Web peut-il faire une requête HTTP à "localhost"? Comment contourne-t-elle la politique interdomaines?

J'ai trouvé ce site Web qui parle de la correction d'une vulnérabilité Redis en exploitant cette même vulnérabilité.

Le site Web en question a un bouton "me patcher", et si vous avez un serveur Redis sans mot de passe en cours d'exécution sur votre machine, il le corrigera.

En d'autres termes, le site Web lui-même se connecte au serveur Redis de votre ordinateur et exécute certaines commandes.

Si vous examinez le code du site Web, vous trouverez, de manière prévisible, ceci:

    var text = "the code to run";
    var bad = "EVAL "  + JSON.stringify(text) + " 0\r\n";
    var x = new XMLHttpRequest();
    x.open("POST", "http://localhost:6379");
    x.send(bad);

À ma grande surprise, cela fonctionne!

Je pensais que la politique interdomaines empêcherait cela de fonctionner, mais ce n'est pas le cas.

Pourquoi cela fonctionne-t-il et comment puis-je ne pas être paranoïaque à l'idée que chaque site Web dans lequel je visite lit l'intégralité du contenu de mon serveur Redis?

C'est parce que c'est seulement écrire mais pas lire? Pourtant, n'importe quel site Web dans le monde pourrait vider mon serveur Redis local/écrire sur quoi que ce soit d'autre en écoutant un port de ma machine sans authentification.

Suis-je en train de manquer quelque chose ici?

15
Daniel Magliola

Pour répondre à la question: Oui, un site Web peut faire une demande HTTP à localhost. Cela ne brisera pas la politique interdomaines, car la demande ne traversera pas les domaines. Il restera local. Une façon d'éviter les stratégies interdomaines consiste à amener la victime cible à effectuer elle-même la requête HTTP. Ainsi, la demande ne traverse jamais de domaines.

Pour vous aider à comprendre le problème que vous avez décrit:

L'attaque n'envoie aucune donnée et ne se connecte à aucun autre endroit que la machine Redis locale. Ce n'est pas le site Web lui-même qui se connecte à votre machine Redis. C'est vous vous connectez à votre machine Redis, exécutez du code/scripts côté client qui vous a couru en cliquant sur le lien. Fondamentalement: vous cliquez sur le lien> Lien téléchargé et exécute du code -> le code génère une demande http -> La demande http va de votre machine à votre machine.

La vulnérabilité du serveur Redis dans cette situation est Cross Site Request Forgery. L'attaquant utilise l'authentification des victimes (dans ce cas, le propriétaire du serveur) pour exécuter l'attaque.

L'attaquant n'a pas le plein contrôle sur le processus. Ils dépendent du propriétaire du serveur Redis pour exécuter le code. Seul le propriétaire (ou quelqu'un d'autre local sur le serveur Redis) a la visibilité (et peut-être la relation d'autorisation et d'approbation) pour accéder à 127.0.0.1 (Localhost)

Tout ce que le code peut faire est d'exécuter des commandes que l'utilisateur local peut exécuter, mais ce n'est pas l'attaquant qui les exécute, c'est le propriétaire, et donc aucune politique inter-domaines n'est violée.

Les seules personnes affectées par des liens comme celui-ci seraient les personnes utilisant des serveurs Redis. Si vous n'en avez pas, le lien ne fera rien. En outre, il ne s'exécutera que sur le serveur Redis local. L'attaquant ne peut pas vraiment choisir où l'exploit se produira.

Recherchez la contrefaçon de demande intersite. https://en.wikipedia.org/wiki/Cross-site_request_forgery

5
meltdownmonk