dimanche 26 novembre 2017

[DEI] XSS exemple

"Le cross-site scripting (abrégé XSS) est un type de faille de sécurité des sites web permettant d'injecter du contenu dans une page, provoquant ainsi des actions sur les navigateurs web visitant la page. Les possibilités des XSS sont très larges puisque l'attaquant peut utiliser tous les langages pris en charge par le navigateur (JavaScript, Java, Flash, etc.) et de nouvelles possibilités sont régulièrement découvertes notamment avec l'arrivée de nouvelles technologies comme HTML5." (Wikipedia)

Pour démontrer cette attaque, nous avons créé l'exemple le plus simple en utilisatant J2EE comme technologie côté serveur. L'application web Java est constituée de deux pages :
  1. Une page HTML qui contient le formulaire qui permet la saisie des données non-vérifiée.
  2. Une page JSP, la page cible qui affiche naïvement un contenu prevenant d'une autre page.
index.html
<html>
    <head>
        <title>Formulaire</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <h1>Exemple attaque XSS :</h1>
        <form action="welcome.jsp" method="post">
            <label>Login : </label>
            <input type="text" name="login" placeholder="Votre login..."/>
            <br />
            <input type="submit" value="Se connecter" />
        </form>
    </body>
</html>

welcome.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Page d'affichage</title>
    </head>
    <body>
        <h1>Exemple attaque XSS :</h1>
        Bienvenue <% out.print(request.getParameter("login")); %>
    </body>
</html>

Il est évident qu'une saisie "normale" (attendue par le développeur) ne causera aucun problème : l'utilisateur saisit son nom sur une page et reçoit un message de bienvenue sur une deuxième page (après authentification par exemple).





Le problème se pose lorsque l'utilisateur introduit un code exécutable. Ce code sera repris par la deuxième page et inséré comme un élément de la page. Sans un contrôle des données, le code exécutable, s'il est bien fait, sera considéré comme un élément ordinaire de la page et exécuté. Le code peut même ajouter des biliothèque de tracking ou bien récupérer des données (Cookies du site actuel) et les envoyer à d'autres serveurs.

A titre d'exemple, si la valeur donnée à l'information "login" dans l'exemple ci-dessus est :
<script language="javascript">(function(){alert("Hello");})();</script>

Le résultat obtenu est le suivant :


Le problème sera mieux compris si nous jetons un coup d'oeil sur le code source de la page :


Nous pouvons constater que le "login" saisi n'est plus une chaîne simple mais il est considéré comme une balise html valide. Etant de type script, la méthode contenue dans l'élément est exécutée et le message "Hello" est affiché.

Le problème peut être résolu par plusieurs méthode. L'idée est de modifier le code saisi pour qu'il ne soit plus exécutable.