L'encodage HTML empêchera-t-il toutes sortes d'attaques XSS?

Je ne suis pas préoccupé par d'autres types d'attaques. Je veux juste savoir si HTML Encode peut empêcher toutes sortes d'attaques XSS.

Existe-t-il un moyen de faire une attaque XSS même si L'encodage HTML est utilisé?

60
demandé sur Niyaz 2008-09-10 14:03:08

9 réponses

Non.

Mettant de côté le sujet de l'autorisation de certaines balises (pas vraiment le point de la question), HtmlEncode ne couvre tout simplement pas toutes les attaques XSS.

Par exemple, considérons le javascript côté client généré par le serveur-le serveur génère dynamiquement des valeurs htmlencoded directement dans le javascript côté client, htmlencode n'arrêtera pas l'exécution du script injecté.

Ensuite, considérons le pseudocode suivant:

<input value=<%= HtmlEncode(somevar) %> id=textbox>

Maintenant, au cas où ce ne serait pas immédiatement évident, si somevar (envoyé par l'utilisateur, bien sûr) est fixé par exemple à

a onclick=alert(document.cookie)

La sortie résultante est

<input value=a onclick=alert(document.cookie) id=textbox>

Ce qui fonctionnerait clairement. Évidemment, cela peut être (presque) n'importe quel autre script... et HtmlEncode n'aiderait pas beaucoup.

Il y a quelques vecteurs supplémentaires à considérer... y compris la troisième saveur de XSS, appelée XSS basé sur DOM (dans lequel le script malveillant est généré dynamiquement sur le client, par exemple en fonction des valeurs#).

Aussi ne pas oublier Attaques de type UTF-7-où l'attaque ressemble à

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

Rien de bien à encoder là-bas...

La solution, bien sûr (en plus de la validation d'entrée de liste blanche appropriée et restrictive), est d'effectuer encodage contextuel: HtmlEncoding est génial si vous êtes le contexte de sortie est HTML, ou peut-être que vous avez besoin de JavaScriptEncoding, ou VBScriptEncoding, ou AttributeValueEncoding, ou... etc.

Si vous utilisez MS ASP.NET, vous pouvez utiliser leur bibliothèque Anti-XSS, qui fournit toutes les méthodes d'encodage de contexte nécessaires.

Notez que tout encodage ne doit pas être limité à l'entrée de l'utilisateur, mais aussi des valeurs stockées à partir de la base de données, des fichiers texte, etc.

Oh, et n'oubliez pas de définir explicitement le jeu de caractères, à la fois dans L'en-tête HTTP et la balise META, sinon vous aurez toujours des vulnérabilités UTF-7...

Quelques informations supplémentaires, et une liste assez définitive (constamment mise à jour), consultez la feuille de triche de RSnake: http://ha.ckers.org/xss.html

86
répondu AviD 2008-09-16 07:57:39

Si vous systématiquement encoder toutes les entrées utilisateur avant d'afficher , alors oui, vous êtes sûr vous n'êtes toujours pas sûr à 100%.
(Voir le post de @ Avid pour plus de détails)

En outre, des problèmes surviennent lorsque vous devez laissercertaines balises non codées afin de permettre aux utilisateurs de publier des images ou du texte en gras ou toute fonctionnalité nécessitant l'entrée de l'Utilisateur être traitée (ou convertie en) balisage non codé.

Vous devrez configurer un système de prise de décision pour décider quelles balises sont autorisé et qui ne le sont pas, et il est toujours possible que quelqu'un trouve un moyen de laisser passer une étiquette non autorisée.

Cela aide si vous suivez les conseils de Joel de faire mal paraître le Code ou si votre langue vous aide {[13] } en avertissant / ne compilant pas lorsque vous produisez des données utilisateur non traitées (typage statique).

9
répondu Pat 2008-09-19 09:44:34

Si vous encodez tout ce qu'il va. (en fonction de votre plate-forme et de l'implémentation de htmlencode) mais toute application web utile est si complexe qu'il est facile d'oublier de vérifier chaque partie. Ou peut-être qu'un composant 3ème partie n'est pas sûr. Ou peut-être qu'un chemin de code que vous avez fait encoder ne l'a pas fait, donc vous l'avez oublié ailleurs.

Donc, vous voudrez peut-être vérifier les choses du côté de l'entrée aussi. Et vous voudrez peut-être vérifier les choses que vous lisez dans la base de données.

3
répondu Mendelt 2008-09-10 10:16:14

Comme mentionné par tout le monde, vous êtes en sécurité tant que vous encodez Toutes les entrées utilisateur avant de les afficher. Cela inclut tous les paramètres de requête et les données extraites de la base de données qui peuvent être modifiées par l'entrée de l'utilisateur.

Comme mentionné par Pat vous aurez parfois envie d'Afficher des balises, mais pas toutes les balises. Une façon courante de le faire est d'utiliser un langage de balisage comme Textile, Markdown, ou BBCode. Cependant, même les langages de balisage peuvent être vulnérable à XSS, juste être conscient.

# Markup example
[foo](javascript:alert\('bar'\);)

Si vous décidez de laisser passer des balises "sûres", je vous recommande de trouver une bibliothèque existante pour analyser et désinfecter votre code avant la sortie. Il y a beaucoup de vecteurs XSS que vous devrez détecter avant que votre désinfectant ne soit assez sûr.

1
répondu metavida 2017-05-23 12:10:18

Je second le Conseil de metavida pour trouver une bibliothèque tierce pour gérer le filtrage de sortie. La neutralisation des caractères HTML est une bonne approche pour arrêter les attaques XSS. Cependant, le code que vous utilisez pour transformer les métacaractères peut être vulnérable aux attaques d'évasion; par exemple, s'il ne gère pas correctement Unicode et l'internationalisation.

Une erreur simple classique que les filtres de sortie homebrew font est d'attraper seulement , mais de manquer des choses comme ", qui peut casser la sortie contrôlée par l'utilisateur dans l'espace d'attribut D'une balise HTML, où Javascript peut être attaché au DOM.

1
répondu tqbf 2008-09-11 19:40:38

Non, le simple codage des jetons HTML courants ne protège pas complètement votre site contre les attaques XSS. Voir, par exemple, cette vulnérabilité XSS trouvée dans google.com:

Http://www.securiteam.com/securitynews/6Z00L0AEUE.html

L'important à propos de ce type de vulnérabilité est que l'attaquant est capable d'encoder sa charge utile XSS en UTF-7, et si vous n'avez pas spécifié d'encodage de caractères différent sur votre page, le navigateur d'un utilisateur pourrait interpréter la charge utile UTF-7 et exécutez le script d'attaque.

1
répondu Chris Kite 2008-09-18 16:19:14

Une autre chose que vous devez vérifier est d'où vient votre entrée. Vous pouvez utiliser la chaîne de référence (la plupart du temps) pour vérifier qu'elle provient de votre propre page, mais mettre un nombre aléatoire caché ou quelque chose dans votre formulaire, puis le vérifier (avec une variable de jeu de session peut-être) aide également à savoir que l'entrée provient de votre propre site et non d'un site de phishing.

0
répondu Mladen Mihajlovic 2008-09-19 10:15:27

Je voudrais suggérer un purificateur HTML ( http://htmlpurifier.org/) il ne filtre pas seulement le html, il le tokenise et le recompile. C'est vraiment de force industrielle.

Il a l'avantage supplémentaire de vous permettre d'assurer une sortie HTML/xhtml valide.

Aussi n'thing textile, c'est un excellent outil et je l'utilise tout le temps, mais je l'exécuterais aussi par purificateur html.

Je ne pense pas que vous avez compris ce que je voulais dire jetons re. HTML Purificateur ne se contente pas 'filter', il reconstruit réellement le html. http://htmlpurifier.org/comparison.html

0
répondu Buzz 2015-08-26 15:06:14

Je ne crois pas. Html Encode convertit tous les caractères fonctionnels (caractères pouvant être interprétés par le navigateur en tant que code) en références d'entités qui ne peuvent pas être analysées par le navigateur et ne peuvent donc pas être exécutées.

&lt;script/&gt;

Il n'y a aucun moyen que ce qui précède puisse être exécuté par le navigateur.

* * à moins que leur est un bug dans le navigateur ofcourse.*

-1
répondu GateKiller 2008-09-10 10:14:47