Les attaques XSS permettent aux attaquants d'injecter des scripts côté client dans les pages web visualisées par d'autres utilisateurs. Les principaux effets de cette vulnérabilité sont la possibilité d'exécuter des actions dans le contexte de l'utilisateur connecté, et de lire des données dans le contexte de l'utilisateur connecté.
Scénario d'attaque
L'attaquant localise la vulnérabilité XSS sur un site web utilisé par la victime, par exemple le site web d'une banque.
La victime est actuellement connectée à cette page
L'auteur de l'attaque envoie à la victime une adresse URL falsifiée.
La victime clique sur l'URL
Sur le site de la victime banque site web, JavaScriptcode commence à s'exécuter pour intercepter les données de l'utilisateur ou exécuter un transfert en son nom vers le compte de l'attaquant
Il convient de noter que les opérations effectuées au nom de la victime peuvent être invisibles pour cette dernière, car elles peuvent se dérouler en arrière-plan à l'aide de l'API de la banque, ou l'attaquant peut les effectuer ultérieurement avec les données nécessaires à l'authentification, les jetons, les cookies, etc.
Types de XSS
1. XSS réfléchi
Il s'agit d'un code HTML/JavaScript contenu dans n'importe quel paramètre (par exemple GET, POST ou cookie) qui est affiché en réponse.
Une page avec une entrée de texte pour rechercher quelque chose qui met le paramètre ?search=foo dans la fin de l'URL lors de l'interrogation de l'API. Après avoir saisi une phrase, si elle n'est pas trouvée, un message de retour est placé dans l'ex HTML.
<div>Aucun résultat trouvé pour <b>foo</b></div>
Nous pouvons essayer de mettre l'URL ?search=..
2.DOM XSS
C'est le cas lorsque son exécution est rendue possible par l'utilisation de fonctions dangereuses dans JavaScript, telles que `eval` ou `innerHtml`. L'"exemple vivant" ci-dessous montre une attaque DOM XSS basée sur l'élément `innerHtml` fonction.
3. XSS stocké
Il s'agit d'un cas où le code malveillant est écrit du côté du serveur. Par exemple, nous pouvons envoyer un commentaire contenant un code malveillant à un article de blog qui est téléchargé sur le serveur. Sa tâche consiste, par exemple, à attendre la modération de l'administrateur, puis à voler ses données de session, etc.
Méthodes d'injection
1. Dans le contenu de la balise
`onerror=alert('XSS')`en
<img src onerror="alert('XSS')" />
2. Dans le contenu de l'attribut
`" onmouseover=alert('XSS')` en
<div class="" onmouseover="alert('XSS')""></div>
Dans le contenu de l'attribut sans les guillemets
x onclick=alert('XSS')en
<div class="x" onclick="alert('XSS')"></div>
Dans le cadre de la hrefattribut ef
javascript:alert('XSS') en
<a href="javascript:alert('XSS')"></a>
Dans la chaîne de caractères du code JavaScript
";alert('XSS')// en
<script>let username="";alert('XSS')//";</script>
Dans l'attribut avec l'événement JavaScript
' ;);alert('XSS')// où ' ; est un guillemet simple, en
Utiliser des systèmes de modèles avec encodage automatique. La plupart des frameworks populaires qui utilisent de tels systèmes nous protègent des injections XSS (Django, Templates, VueReact, etc.)
N'utilisez pas de fonctions telles que eval ou Fonction avec des données d'utilisateurs non fiables.
N'utilisez pas de fonctions et de propriétés qui attribuent un code HTML directement aux éléments de l'arbre DOM, par exemple, innerHTML, outerHTML, insertAdjacentHTML, ocument.write. Au lieu de cela, vous pouvez utiliser des fonctions qui attribuent directement du texte à ces éléments, telles que texteContenu ou innerText.
Soyez prudent lorsque vous redirigez l'utilisateur vers une URL qu'il contrôle. Risque d'injection location = 'javascript('XSS')'.
Filtrer le HTML à l'aide de bibliothèques telles que DOMPurify.
Attention au téléchargement .html ou .svg fichiers. Vous pouvez créer un domaine distinct à partir duquel les fichiers téléchargés seront servis.
Utiliser le Politique de sécurité du contenu mécanisme.
Jetez un coup d'œil aux filtres anti-XSS intégrés dans la plupart des navigateurs populaires.
Si cet article vous intéresse, suivez Lukasz sur Github : https://github.com/twistezo