web-dev-qa-db-fra.com

Script XSS réfléchi passant par l'URL comment le faire fonctionner et quelles sont les conditions préalables pour qu'il fonctionne?

En essayant de me renseigner sur la sécurité, j'ai installé le site Web le plus simple sur mon hôte local composé d'une page html qu'un serveur Apache dessert. J'ai d'abord commencé à essayer et à ajouter le script JS qui serait exécuté à la fin d'une URL:
/index.html?message=<script>alert('XSS');</script>

Le navigateur l'encode pour:

/index.html?message=%3Cscript%3Ealert(%27XSS%27);%3C/script%3E

Ma compréhension de la façon dont ce type de vecteur d'attaque devrait fonctionner est que l'attaquant envoie une URL similaire à la victime -> la victime clique dessus -> le script est exécuté (vous n'êtes pas sûr du moment exact où il devrait être exécuté?)

Des questions:

  1. Pourquoi ne s'exécute-t-il pas?
  2. Comment le faire exécuter?
  3. Quels sont les prérequis d'une telle attaque - peut-être ne suffit-il pas d'avoir une simple page Web?
  4. Quand ce script doit-il être exécuté? Après le chargement du DOM?

Des explications générales sur la manière dont cela devrait fonctionner seraient également très appréciées. Je vous remercie!

4

Les attaques XSS sont basées sur le fait que l'entrée devient une sortie vers le navigateur de l'utilisateur final. L'attaque la plus courante est essentiellement un site PHP contenant

<?php
echo $_GET["message"];
?>

Vous passeriez alors à cette URL un paramètre contenant le code javascript. Si vous souhaitez configurer cela, créez un fichier something.php Sur votre serveur Web, saisissez-y le code ci-dessus, puis accédez à http://your-server/something.php?message=<script>alert('XSS');</script> dans votre navigateur. Il devrait ensuite afficher une fenêtre contextuelle contenant XSS.

Dans une page HTML statique, cela n'est pas possible, car il génère uniquement du contenu basé sur le code HTML statique du serveur. XSS nécessite l'inclusion de code fourni par l'utilisateur. L'exclusion est, si le html charge un code javascript vulnérable, qui permet une entrée fournie par l'utilisateur.

Le point principal de XSS est qu'un attaquant souhaite inclure son code sur VOTRE site Web, sans pirater le serveur Web. Cela n'est possible qu'avec les langages de programmation côté serveur, qui produisent quelque chose, l'attaquant a précédemment mis dans le serveur.

Fondamentalement, le pirate veut que le HTML ressemble au navigateur comme ceci

<html><body>Foo<script>alert('XSS');</script></body></html>

au lieu de

<html><body>Foo</body></html>

Pensez par exemple à un forum ou à des commentaires sur un article. L'utilisateur doit être autorisé à laisser ses remarques. Le serveur doit l'enregistrer et présenter le même commentaire aux autres utilisateurs. Si le commentaire lui-même contient du code javascript et que le programme serveur n'atténue pas cela, il afficherait le même code dans le cadre du bloc de commentaires.

Quant à savoir quand cela est chargé dans le navigateur, ce n'est pas facile de répondre. Cela dépend de l'endroit où le code du pirate est inclus dans le corps de la page ou des fichiers javascript chargés par la suite. S'il est inclus en tant que balise javascript dans le code HTML principal, il sera chargé une fois le chargement DOM terminé. Surtout comme mentionné précédemment, la vulnérabilité XSS pourrait également se produire à l'intérieur d'un fichier javascript (qui prend l'entrée utilisateur, par exemple une URL et la charge). Dans ce cas, il n'est pas possible de dire quand exactement le code s'exécutera. Vous pouvez lier ce code javascript à un bouton, à un événement onblur () de zone de texte ou à une minuterie.

ÉDITER:

En élaborant sur l'attaque javascript, voici ce que vous mettriez dans votre fichier serveur

<html><body>
<script type="text/javascript">
    var queryDict = {};
    location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]});
    document.write(decodeURIComponent(queryDict["message"]));
</script>
</body></html>

Les deux premières lignes prennent essentiellement tous les paramètres GET et les divisent en un tableau (extrait de ici ). La troisième ligne affiche ensuite simplement cela dans la page HTML. Bien sûr, cela pourrait également être fait par toute autre manipulation DOM à partir du code exécuté.

5
Spacy