web-dev-qa-db-fra.com

Est-il sécurisé d'utilisation window.location.href directement sans validation

Est-il sécurisé d'utiliser window.location.href sans aucune validation?

Par exemple:

<script>
    var value = window.location.href;
    alert(value);
</script>

Dans l'exemple ci-dessus, est-il vulnérable aux attaques XSS (Cross-Site Scripting)? Si c'est le cas, alors comment? Comment l'attaquant peut-il modifier la valeur de window.location.href en fonction du contenu malveillant?

Edit (Seconde situation)

Ceci est l'URL: www.example.com?url=www.attack.com

Supposons simplement que j'ai une fonction getQueryString () qui retournera une valeur sans validation.

<script> 
    var value = getQueryString('url'); 
    window.location.href = value; 
</script>

Même question, est-il vulnérable aux attaques XSS (Cross-Site Scripting)? Si oui, comment? Comment un attaquant peut-il simplement utiliser "window.location.href = value" pour effectuer XSS?

11
overshadow

Utiliser location.href peut être compris comme incluant deux choses:

  1. Utiliser la valeur de location.href en le transmettant dans votre code, en le manipulant et en l’utilisant pour guider la logique dans votre code.
  2. Attribuer quelque chose à location.href, obligeant le navigateur à naviguer vers différentes URL.

Le premier, en utilisant la valeur, peut être considéré comme sûr. La valeur de location.href n'est rien de plus qu'une chaîne. Bien sûr, cela fait partie de la saisie de l'utilisateur, vous ne voulez donc pas la passer à une instruction eval, mais c'est également le cas pour toutes les autres formes de saisie de l'utilisateur. En fait, la valeur de location.href est toujours une URL valide. Certaines hypothèses peuvent donc être formulées sur son contenu. Dans ce sens, vous pouvez dire que c'est plus sûr que la plupart des formes de saisie utilisateur. Tant que vous ne faites pas de mauvaises hypothèses.

Le second est une chose à laquelle vous devriez faire attention. Si vous lui attribuez des valeurs non validées, cela peut conduire à des redirections ouvertes pouvant être utilisées pour le phishing et, en plus, aux problèmes XSS liés à l'utilisation des URI javascript: et vbscript:.


Edit: Comme demandé, voici une explication plus détaillée des problèmes liés à l'assignation à location.href:

Supposons que vous avez une variable foo contrôlée par l'attaquant. La source peut être quelque chose de vraiment, mais un paramètre de chaîne de requête est un bon exemple. Que se passe-t-il lorsque vous affectez la valeur foo à location.href? Eh bien, le navigateur fait de son mieux pour interpréter la valeur comme un URI, puis redirige l'utilisateur vers l'adresse résultante. Dans la plupart des cas, cela déclenchera un chargement de page. par exemple. Si value est "https://www.google.com/", la page d'accueil de Google sera chargée. Permettre que cela se produise sans interaction de l'utilisateur s'appelle une open redirect et est considéré comme une faille de sécurité!

Il existe cependant des types d'URI qui ne déclencheront pas le chargement d'une page. Un exemple courant d'un tel URI serait un exemple ne contenant rien d'autre qu'un identifiant de fragment, par exemple. #quux. En attribuant cela à location.href, la page défilerait jusqu'à l'élément portant l'ID "quux" et ne ferait rien d'autre. Les URI de fragments sont sûrs tant que vous ne faites rien de stupide avec les valeurs des fragments eux-mêmes.

Ensuite, à la partie intéressante: javascript: et vbscript: URI. Ce sont ceux qui vont vous mordre. Les modèles d'URI JavaScript et VBScript sont des modèles d'URI non standard pouvant être utilisés pour exécuter du code dans le contexte de la page Web actuellement ouverte. Cela semble mauvais, n'est-ce pas? Eh bien, ça devrait. Considérez notre variable contrôlée par l'attaquant foo: tout ce qu'un attaquant doit faire pour lancer une attaque contre vos utilisateurs consiste à injecter un URI de script dans la variable. Lorsque vous l'attribuez à location.href, c'est essentiellement la même chose que d'appeler eval dans le script.

Les URI JavaScript fonctionnent dans tous les navigateurs modernes, alors que VBScript est uniquement destiné à IE et nécessite que la page soit rendue en mode quirks.

Enfin, il existe un autre schéma d'URI intéressant à prendre en compte: l'URI des données. Les URI de données sont des littéraux de fichier: des fichiers entiers codés sous forme d'URI. Ils peuvent être utilisés pour encoder tous les fichiers, y compris les documents HTML. Et ces documents, comme tous les autres, peuvent contenir des scripts.

La plupart des navigateurs traitent chaque URI de données comme étant unique Origine . Cela signifie que les scripts d'un document HTML encapsulé dans un URI de données ne peuvent accéder à aucune donnée des autres pages. Sauf dans Firefox.

Firefox traite les URI de données un peu différemment de tous les autres navigateurs. Dans ce document, les URI des données hériter l'origine du document quel qu'il soit l'ouvre. Cela signifie que tous les scripts peuvent accéder aux données contenues dans le document de référence. Et c'est XSS pour vous.

15
jupenur

Un XSS n'est pas possible sous # 1

Le pire des cas auquel je puisse penser est que quelqu'un l'utilise pour l'ingénierie sociale (disons que votre domaine est vraiment populaire, comme Ebay ou Amazon), ce qu'un attaquant pourrait faire est de créer un message disant: "Des trucs gratuits Amazon/Ebay pour vous, juste allez à http://haxor.site "en utilisant l'URL et en l'envoyant à quelqu'un.

Mais je ne trouve toujours pas cela dangereux, car le codage de l'URL aurait l'air plutôt confus.

EDIT: Cette seule réponse n ° 1, car lorsque j'ai répondu à cette question, il n'y avait pas de "n ° 2"

1
Jhuliano Moreno
var value = getQueryString('url'); 

window.location.href = encodeURI(value); 

Je pense que c'est le moyen le plus simple

0
wushang