Prérequis

Pour comprendre l’ensemble de cet article, il vous faudra:

  • Savoir coder en HTML
  • Connaître les bases du PHP et du Javascript
  • Savoir ce qu'est une XSS (voir mon article sur les XSS si besoin)
  • Définition

    Une XSS stockée est possible lorsque l’entrée utilisateur est stockée en base de données et afficher sur la page. On peut prendre comme exemple une page de forum.

    Explication de la faille

    Prenons comme exemple une page de forum qui affiche les messages postés.
    Voici la partie du code PHP qui affiche les messages:

    //Connexion à la base de données
    $request = $database->query('SELECT user, message FROM messages ORDER BY id DESC LIMIT 0, 5');
    
    while($data = $request->fetch()){
    echo "<p>" . $data['user'] . ": " . $data['message'] . "</p>";
    }
    

    La partie intéressante dans ce code, est la fonction echo, qui affiche les messages et les pseudos sans filtres. Ceci nous permet donc d’entrer des balises qui vont par la suite être interprétées.

    Par exemple si on tente d’injecter <u>bonjour</u>, le rendu sur la page sera:
    bonjour
    La fonction echo a interprété les balises <u>. Vous vous sûrement demandez en quoi c’est dangereux qu’un utilisateur envoie un message souligné, et bien c’est parce que si echo interprète les balises <u>, il va aussi interpréter les balises <script>.

    Exploitation

    Maintenant qu’on a la capacité d’interprété nos balises, on peut passer à l’exploitation. En entrant <script>alert()</script>, au moment du chargement de la page le script va être exécuté, et l’alert va être affiché. A partir du moment où on peut exécuter du Javascript on peut par exemple récupérer les cookies des autres utilisateurs.
    Je vous laisse voir ma Cheat Sheet XSS pour voir comment récupérer ces fameux cookies. :)

    XSS Cheat Sheet