Le Cross-Site Scripting, largement connu sous le nom de XSS, est l'une des méthodes d'attaque les plus dangereuses employées par cybercriminels, il est donc vital que chaque développeur et chercheur en sécurité sache de quoi il s'agit et comment prévenir les attaques. Alors, comment pouvez-vous agir contre la vulnérabilité XSS? Vous utilisez HTML, JavaScript ou DOM pour afficher les données qu'un site Web reçoit de l'utilisateur. Un ou plusieurs de ces trois domaines différents peuvent travailler ensemble.
Comment empêcher XSS en utilisant HTML
XSS permet aux attaquants d'injecter des codes malveillants ou des scripts dans des pages Web, ciblant les utilisateurs sans méfiance visitant le site. Cela pourrait voler des données personnelles, rediriger les visiteurs vers un autre site mis en place par le cybercriminel ou altérer l'apparence de la page Web. Mais vous pouvez empêcher que cela se produise; par exemple, en les empêchant d'insérer du HTML.
Imaginez que vous avez un site Web avec un livre d'or. Disons que vos visiteurs utilisant ce livre d'or peuvent écrire leurs noms et messages ici, et leurs messages peuvent être consultés publiquement. Un attaquant voulant faire un test XSS dans votre livre d'or utilisera la zone que vous lui avez allouée pour écrire un message. Ce cybercriminel exécutera un code JavaScript ici. Par exemple, un attaquant pourrait utiliser du code JavaScript tel que :
<scénario>alerte("Le XSS !")</script>
L'attaquant doit utiliser une balise de script pour que cela réussisse. S'ils ne le font pas, le code JavaScript ne fonctionnera pas. Vous devez coder l'instruction < afin que les utilisateurs ne puissent jamais utiliser de balises HTML. Cela rendra difficile pour l'attaquant de travailler avec des balises HTML.
Comment empêcher XSS à l'aide de JavaScript
La logique en HTML est également valide en JavaScript. Dans certaines applications, il est possible d'imprimer les données reçues par le site Web de l'utilisateur avec un code JavaScript.
Considérez ce codage :
<p id="imprimer"></p>
<scénario>
document.getElementById("test").innerHTML = "";
</script>
Imaginez qu'un site Web utilise un bloc de code comme celui ci-dessus. Le développeur a utilisé une balise "p" appelée "print" ici. Comme vous pouvez le voir dans le code, une valeur viendra du paramètre "search", et le développeur souhaite afficher cette valeur entrante dans la balise "p". Le développeur qui a réalisé cette opération souhaitait utiliser la fonctionnalité innerHTML de JavaScript.
Examinons maintenant la situation du point de vue du cyberattaquant. Dans un tel cas, l'attaquant effectuera un test XSS dans la balise "script". Pour cela, l'attaquant n'a pas besoin de redémarrer la balise, car une balise "script" est déjà utilisée. L'attaquant pourrait alors écrire un test comme celui-ci :
nomfichier.php? rechercher=un" alerte("Le XSS !"); f= "
Ce code apparaîtra sur le site Web sous la forme :
document.getElementById("test").innerHTML = " un" alerte("Le XSS !"); f="";
Cette attaque serait couronnée de succès. Pour mieux comprendre le problème, examinons un autre exemple de technique qu'un attaquant pourrait utiliser. Le pirate peut avoir appliqué un test XSS tel que :
nomfichier.php? rechercher=";</script><em>Fatih</em>
Voici à quoi cela ressemblerait vu du site Web :
document.getElementById("test").innerHTML = "";</script><em>Fatih</em>";
Cela peut sembler un peu étrange car l'attaquant a fermé la première balise "script" en utilisant une structure comme "/script" ici. Ainsi, l'attaquant peut redémarrer n'importe quel code JavaScript et HTML de son choix.
Si vous pensez à ces deux exemples différents, la protection contre XSS semble assez simple. La précaution nécessaire serait d'encoder les " et ' caractères que vous voyez dans le premier exemple. Dans le deuxième exemple, encodez les caractères < et >.
Comment empêcher XSS d'utiliser DOM
Dans cette variante de XSS, les données que le site Web reçoit de l'utilisateur peuvent interférer avec la propriété d'un élément DOM. Par exemple, les informations de couleur que le site reçoit de l'utilisateur peuvent affecter la couleur d'arrière-plan d'un tableau ou l'ensemble de l'arrière-plan de la page. Ainsi, l'utilisateur interfère involontairement avec les dispositions de style du corps et de la table. Le code suivant en est un bon exemple :
<corps bgcolor="<?php echo $_GET['couleur']; ?>"/>
Avec cela, le site Web utilise le paramètre "color" reçu de l'utilisateur directement dans la propriété "bgcolor" de l'élément "body". Alors, que pourrait faire un attaquant à ce stade? Ils pourraient exécuter ce code malveillant :
nomfichier.php? couleur=rouge" onload="alerte('Le XSS !')
Cela ressemble à ceci vu depuis le site Web :
<corps bgcolor=" rouge" onload="alerte('Le XSS !') "/>
Pour éviter que cela ne se produise, le développeur devrait encoder le " personnage.
Cependant, il y a un autre élément important dans JavaScript à noter. L'extrait de code suivant en est un exemple :
<un href="javascript: alerte('Le XSS !')">
Cela signifie qu'il est possible d'exécuter directement du code JavaScript. L'une des meilleures mesures préventives consiste à s'assurer que le site Web vérifie si les données qu'il reçoit des utilisateurs sont une véritable URL. La méthode la plus simple consiste à s'assurer qu'il existe des expressions telles que "HTTP" et "HTTPS" (la version sécurisée de HTTP) dans la connexion.
Un exemple de fonction pour empêcher XSS avec PHP
Vous avez vu quelques exemples de la façon de protéger une application ou un site Web contre les attaques XSS. Vous pouvez utiliser les extraits de code de ce tableau avec PHP :
Encoder en HTML |
htmlspecialchars($str, ENT_COMPAT) |
Encoder en attribut JavaScript et DOM |
htmlspecialchars($str, ENT_NOQUOTES) |
Vérification des URL |
'/^(((https?)|(\/\/))).*/' ; |
Notez qu'il ne s'agit que d'exemples et qu'ils varient en fonction du langage du logiciel que vous utilisez.
Tu peux créer une application web avec PHP et essayez les codes que vous voyez ci-dessus pour les envoyer par SMS. Si vous vous demandez comment utiliser toutes ces méthodes, vous pouvez trouver quelques idées dans le bloc de code PHP ci-dessous, qui devrait être utile même si vous utilisez un langage différent :
<?php
$données = $_GET['données'] ;fonctionin_attribute($str){
retour htmlspecialchars($str, ENT_COMPAT);
// ENT_COMPAT encodera le caractère guillemet double (").
}
fonctionin_html($str){
$lien = '/^(((https?)|(\/\/))).*/';
si(!preg_match($lien, $str))
{
retour "/";
}
retour $str;
}
$data = in_attribute($data);
$data = in_html($data);
$données = real_url (données);
?>
Protégez votre site Web contre XSS et plus
XSS est un vecteur d'attaque populaire utilisé par les pirates. Habituellement, une valeur de chemin dans l'URL, tout champ de votre site Web où des données peuvent être saisies (comme les formulaires et les champs de commentaires), peut être utilisé pour tester une vulnérabilité XSS. Mais bien sûr, il existe de nombreuses méthodes différentes que les cybercriminels peuvent utiliser pour attaquer un site, surtout si vous avez un site Web qui compte de nombreux utilisateurs et cache leurs informations.