J'aide avec une formation d'une heure pour les développeurs (~ 100 d'entre eux) sur les scripts intersites. Quels sont, selon vous, les concepts indispensables pour leur transmettre? En ce moment, nous avons:
Et surtout, l'impact potentiel des vulnérabilités.
Du point de vue d'un développeur, les deux premiers points que vous avez ne sont pas très pertinents. Les XSS stockés et réfléchis ont la même atténuation: échappent correctement les éléments que vous générez en fonction de leur contexte. Les couches de défense ne seront probablement perçues que comme une excuse pour mal mettre en œuvre cette atténuation: "Le WAF va l'attraper pour moi."
Au lieu de cela, concentrez-vous sur ces pratiques d'hygiène du code:
jsstringsafeEmail
, htmlattrsafeColor
, htmltextsafeFullName
, etc.Quels sont, selon vous, les concepts indispensables pour leur transmettre?
Quoi d'autre? La grande chose qui manque à votre liste est: il existe un grand nombre d'outils et de techniques qui peuvent tous être utilisés pour atténuer ces vulnérabilités potentielles; la défense en profondeur suggère que nous en utilisons autant que possible.
Vous avez couvert la plupart des bases. Pour approfondir un peu vos points (certains d'entre eux sembleront évidents pour la plupart des lecteurs ici, mais ne seront pas nécessairement évidents pour tous les développeurs):
Mais le point le plus important à mon avis: le codage HTML devrait se produire par défaut, en utilisant un moteur de modèle qui code tous les paramètres par défaut.
Si l'encodage se produit partout, il est trop facile de l'oublier une seule fois. Il est bien sûr toujours important de prendre soin de toutes les situations où l'encodage HTML n'est pas suffisant, mais la plupart des vulnérabilités XSS seront évitées par l'encodage par défaut.
Je pense que les deux leçons les plus importantes à enseigner sont les suivantes:
Sur mon premier point: presque tous les problèmes d'injection proviennent du travail au mauvais niveau d'abstraction : les programmeurs concaténent des chaînes dans des situations où ils devraient utiliser plus -des opérations de niveau qui s'éloignent de la façon correcte de faire les choses. Et cela signifie que:
Sur le deuxième point: une bonne leçon sur les dangers de s'appuyer sur le filtrage côté entrée serait de parcourir les OWASP XSS Filter Evasion Cheat Sheet . Considérez cette page comme documentant une tentative échouée après l'autre et une autre pour résoudre XSS grâce au filtrage côté entrée, et l'habileté que les attaquants ont pu utiliser pour contourner ce problème.
Vous voyez également souvent de nombreux conseils qui parlent d'entrées "non fiables" et de la façon de les traiter, ce qui est semé d'embûches car:
OWASP XSS Prevention Cheat Sheet est un autre document vraiment excellent qui suit mes deux points. Il explique comment en toute sécurité insérer des chaînes arbitraires dans du code HTML généré dynamiquement, Documents CSS et Javascript. Si vous résolvez ce problème en un seul endroit (soit dans une bibliothèque tierce, soit dans votre base de code) et appliquez cette solution de manière cohérente, vous réussirez très bien - vous aurez "coupé la jugulaire" des vulnérabilités XSS.
Vous avez déjà énuméré certains des concepts les plus importants - la seule chose que j'ajouterais est l'ubiquité et la facilité des tests pour les vulns XSS. XSS est souvent la première vulnérabilité qui est enseignée, et après l'injection SQL peut-être la plus connue. Il est également trivial de rechercher, et de nombreux scanners d'applications comme burp et w3af pourront détecter automatiquement XSS.
Comprendre cela est important, car il explique pourquoi xss existe toujours: à peu près tous les sites ont une sorte de protection xss en place, mais sont toujours vulnérables lorsqu'un testeur ou un scanner intelligent est en mesure de trouver une entrée utilisateur que le développeur a oubliée. Pour développer en toute sécurité un logiciel sans xss, les développeurs doivent être conscients que les attaquants utilisent des vecteurs étranges pour soumettre des charges utiles - par exemple En-têtes HTTP, menus déroulants, tout ce qui peut être modifié dans un proxy HTTP.
Le point le plus important à faire valoir, à mon humble avis, est que vous devez savoir ce que contient une variable (ou un champ de base de données). Vous devez savoir s'il s'agit de texte (et de quel jeu de caractères/encodage, dans ce cas), ou HTML (ou un attribut HTML, qui est encore un autre type de données), ou SQL, etc.
Ensuite, vous devez vous appliquer aux conversions appropriées lorsque vous devez passer de l'un à l'autre.
Le gros problème est que dans de nombreux cas, la représentation d'un morceau de texte (probablement le type de données le plus courant que vous pouvez manipuler) est la même qu'il s'agisse de texte, HTML, SQL, etc. (le texte "abc" est le même comme HTML abc
ou SQL 'abc'
) et pour cette raison, les gens ont tendance à concaténer des bits ensemble sans aucune conversion.
Mais cela se cassera dès que vous rencontrerez des personnages qui ont une signification particulière dans l'un des contextes. Cela entraîne non seulement des problèmes de sécurité (injections XSS et SQL), mais également des problèmes de formatage (nous avons tous vu des sites qui commencent à afficher des entités HTML telles que <
quand ils devraient afficher <
), car les utilisateurs oublient la conversion ou le font plusieurs fois.
Il est assez rare que vous ayez réellement besoin d'autoriser la saisie de HTML réel. Dans la plupart des cas, vous voulez du texte. Gardez simplement le texte tel qu'il est, manipulez-le tel quel. Mais une fois que vous voulez l'afficher (sur une page HTML), convertissez-le en HTML (en utilisant standard et testé bibliothèques/frameworks, pas votre recherche et remplacement improvisés basés sur des expressions rationnelles).
De même, vous le convertissez lorsque vous souhaitez créer une requête SQL (à l'aide de requêtes paramétrées, de préférence). Mais vous le conservez toujours tel quel.
De nombreux frameworks ajouteront des couches d'abstraction qui "masqueront" tout cela si vous les utilisez réellement. Mais nous savons tous que même avec les meilleurs outils, vous vous retrouverez toujours avec quelqu'un qui essaiera de créer un peu de HTML lui-même, donc ils doivent savoir ce qui doit être fait s'ils le font.
Si vous voulez/devez manipuler du HTML réel, vous entrez une dimension complètement différente en termes de problèmes XSS. Notez bien que cela peut être couvert en une heure ...
XSS est sérieux
Effectuez une démonstration de XSS pour montrer qu'il a un impact réel, au-delà de alert('xss')
.
XSS nous affecte
Fournissez des statistiques, par ex. 17 défauts XSS dans nos produits ont été identifiés lors de tests de pénétration au cours de l'année écoulée.
La solution s'échappe
Montrez-leur la différence entre le code qui ne s'échappe pas et qui est vulnérable et le code qui s'échappe. Réessayez la démonstration et voyez comment elle échoue.
Bonne pratique de codage
Montrez-leur de bonnes manières de s'évader avec les langages et frameworks utilisés dans votre entreprise. Idéalement, un moteur de modèle qui effectue un échappement automatique. Si vous avez un seul langage/cadre dans toute l'entreprise, c'est plus facile. Sinon, montrez un exemple et dites-leur de lire le cadre particulier qu'ils utilisent.
pièges courants
Contexte de la page. Même si vous disposez d'un moteur de modèle d'échappement, les données non fiables dans un <script>
la balise peut provoquer XSS.
Quelles données ne sont pas fiables? Par exemple, si vous récupérez un flux RSS à partir d'un site externe, il s'agit toujours d'un risque XSS, même s'il ne s'agit pas d'une entrée directe de l'utilisateur.
DOM XSS - l'utilisation de JavaScript eval et document.write peut provoquer XSS.
Défense en profondeur
Le CSP est une excellente défense en profondeur, mais peut être difficile à mettre en œuvre.
Les options de cookies et la validation des demandes peuvent être facilement implémentées, mais ne sont que des défenses partielles.
Demandez de l'aide
Lorsque vous faites quelque chose de difficile - comme permettre aux utilisateurs d'utiliser des balises HTML limitées dans les commentaires - demandez de l'aide à un spécialiste de la sécurité.