web-dev-qa-db-fra.com

Que pourrait faire un XSS "<img src ="?

La plupart des WAF lors du blocage de XSS bloquent les balises évidentes comme script et iframe, mais ils ne bloquent pas img.

Théoriquement, vous pouvez img src='OFFSITE URL', mais quel est le pire qui puisse arriver? Je sais que vous pouvez voler des adresses IP avec, mais est-ce que c'est?

84
user1910744

Comme Anders dit: Blender fait un très bon point sur les dialogues d'authentification, et korockinout1 a raison sur les attributs on. De plus, Aders ajoute des arguments sur la balise a et Matija ont un bon lien sur l'exploitation des bibliothèques faisant le rendu.

Pourtant, personne n'a encore parlé de SVG.

Tout d'abord, supposons que toutes les entrées et sorties sont correctement nettoyées, donc les astuces avec onerror/onload ne sont pas possibles. Et que nous ne sommes pas intéressés par la CSRF. Nous recherchons XSS.

La première préoccupation concernant <img src= est qu'il ne suit pas la même politique d'origine. Mais c'est probablement moins dangereux qu'il n'y paraît.

Ce que le navigateur fait pour rendre une balise <img>

< img src="http://domain/image.png" > est assez sûr car le navigateur n'invoquera pas un analyseur (par exemple un analyseur XML ou HTML), il sait que ce qui va venir est une image (gif, jpeg, png).

Le navigateur exécutera la requête HTTP et lira simplement le MIME de ce qui est arrivé (dans le Conetent-Type en-tête, par exemple image/png). Si la réponse n'a pas de Content-Type plusieurs navigateurs devineront en fonction de l'extension, mais ils ne devineront que les MIME d'images: image/jpeg, image/png ou image/gif (tiff, bmp et ppm sont douteux, certains navigateurs peuvent avoir un support limité pour les deviner). Certains navigateurs peuvent même essayer de deviner le format d'image sur la base de nombres magiques, mais là encore, ils n'essaieront pas de deviner les formats ésotériques.

Si le navigateur peut correspondre au MIME (probablement deviné), il charge la bibliothèque de rendu correcte, les bibliothèques de rendu peuvent avoir un débordement, mais c'est une autre histoire. Si le MIME ne correspond pas à une bibliothèque de rendu d'image, l'image est supprimée. Si l'appel de bibliothèque de rendu échoue, l'image est également supprimée.

Le navigateur n'est même jamais proche d'un contexte d'exécution (script). La plupart des navigateurs n'entrent dans le contexte d'exécution que depuis l'analyseur javascript, et ils ne peuvent atteindre l'analyseur javascript que depuis le application/javascript MIME ou à partir des analyseurs XML ou HTML (car ils peuvent avoir des scripts intégrés).

Pour effectuer XSS, nous avons besoin d'un contexte d'exécution. Entre SVG.

Utilisation de <img src = "domain/blah/blah/tricky.svg">

Aïe, aïe aïe. SVG est un format graphique vectoriel basé sur XML, il appelle donc l'analyseur XML dans le navigateur. De plus, SVG a le <script> tag! Oui, vous pouvez intégrer javascript directement dans SVG.

Ce n'est pas aussi dangereux qu'il y paraît au premier abord. Navigateurs prenant en charge SVG dans <img> les balises ne prennent pas en charge les scripts dans le contexte . Idéalement, vous devriez utiliser SVG dans <embed> ou <object> balises où les scripts sont pris en charge par les navigateurs. Pourtant, ne le faites pas pour le contenu fourni par l'utilisateur!

Je dirais que permettre SVG à l'intérieur <img src= peut être dangereux:

  • Un analyseur XML est utilisé pour analyser le SVG, que ce soit à l'intérieur du <img> ou <object> tag. L'analyseur est certainement modifié avec certains paramètres pour ignorer <script> balises dans le <img> le contexte. Pourtant, c'est assez moche, c'est mettre sur liste noire une balise dans un certain contexte. Et la mise sur liste noire est une mauvaise sécurité.

  • <script> n'est pas le seul moyen d'obtenir un contexte d'exécution dans SVG, il y a aussi les événements onmouseover (et famille) présents dans SVG. C'est encore une fois difficile à mettre sur liste noire.

  • L'analyseur XML dans les navigateurs a souffert de problèmes dans le passé, notamment avec les commentaires XML autour des blocs de script. SVG peut présenter des problèmes similaires.

  • SVG prend entièrement en charge les espaces de noms XML. Aïe encore. xlink:href est une construction entièrement valide en SVG et le navigateur dans le contexte de l'analyseur XML le suivra probablement.

Donc oui, SVG ouvre plusieurs vecteurs possibles pour réaliser le contexte d'exécution. Et de plus, il s'agit d'une technologie relativement nouvelle et donc peu endurcie. Je ne serais pas surpris de voir des CVE sur la gestion des SVG. Par exemple ImageMagick a eu des problèmes avec SVG .

84
grochmal

Firefox (corrigé dans Nightly 59.0a1), Safari (résolu dans Safari Technology Preview 54), Edge et Internet Explorer affichent une boîte de dialogue d'authentification si vous demandez une image et que le serveur vous demande de vous authentifier avec l'authentification HTTP de base. Cela permet à un attaquant de afficher une boîte de dialogue d'authentification lorsque le navigateur d'un utilisateur essaie de charger l'image:

  • Firefox . Corrigé à partir de Nightly 59.0a1, mais l'avertissement présent dans la dernière version stable:

    Firefox displaying an "Authentication Required" dialog

  • Safari . Corrigé depuis Safari Technology Preview 54, mais le modal est toujours présent dans la dernière version stable. Notez qu'il s'agit d'une boîte de dialogue modale et que le reste du site Web est grisé. "Vos informations de connexion seront envoyées en toute sécurité" est également techniquement vrai, mais peut donner une mauvaise impression à un utilisateur imprudent:

    Safari displaying a modal authentication dialog

  • IE11 . Une boîte de dialogue Windows native verrouille l'ensemble du navigateur:

    IE11 displaying a native dialog

Si vous faites de realm une très longue chaîne de a\ta\ta\t...a\t, IE11 se bloque complètement.

Un nom de domaine et un domaine bien choisis peuvent inciter les utilisateurs à envoyer leurs noms d'utilisateur et mots de passe au serveur d'un attaquant, ou rendre votre site Web complètement inaccessible.

111
Blender

<img src=http://evil.com N'est pas trop un problème, mais <img src=a onerror=alert('XSS')> peut être utilisé pour injecter n'importe quel JavaScript arbitraire. En fait, n'importe quelle balise HTML combinée avec n'importe quel attribut d'événement "on" (par exemple, onerror, onclick, ontouchstart, etc.) peut être utilisée pour exécuter des charges utiles JavaScript sans restriction.

42
multithr3at3d

D'accord, que diriez-vous de ceci: (Vous devriez probablement prendre du recul.)

<img src="file://uhoh.gif”>

Oh je sais, non? Quel monstre!

Ça pourrait être le cas si vous utilisez SMB ...

C'est un bug qui existe depuis 18 ans! Voir ce rapport de vulnérabilité de 1997. Voici la même vulnérabilité à BlackHat, en 2015 .

Cela affecte Internet Explorer, y compris Microsoft Edge. Il convient de noter que cela n'affecte pas Chrome ou les navigateurs Mozilla. IE tente de s'authentifier automatiquement sur le site Web de l'attaquant, en transmettant le nom d'utilisateur et le mot de passe NTLM haché à le serveur distant, et oui même sur internet (!!).

Je conclus donc que personne ne devrait jamais utiliser de balise IMG.

Oui, mais est-ce XSS? Non, il ne lance pas nécessairement ni ne constitue une attaque XSS, à ma connaissance. Bien qu'il puisse être lancé à partir d'un seul, ce n'est pas une exigence. Le cross-network compte-t-il?

35
Adam White

Je pense que par "img XSS" vous voulez dire "site qui autorise des valeurs arbitraires pour le src="" attribut de <img /> éléments".

... dans ce cas, le principal risque est la falsification de requêtes intersites (CSRF) car cela signifie qu'un attaquant peut faire une cible faire une requête arbitraire GET, l'exemple canonique étant le "site Web de banque mal codé fait transferts d'argent utilisant GET requêtes "-vulnérabilité.

Cependant, il ne doit pas nécessairement être un Cross Site Request Forgery - j'imagine le type principal de site qui permet aux utilisateurs <img /> elements est un forum Web - et les forums Web ont tendance à avoir des panneaux de contrôle d'administration sur le même site Web - donc si des actions d'administrateur ou de modérateur "utiles" pourraient être invoquées via GET, c'est une autre possibilité - mais cela relève toujours de le parapluie CSRF.

17
The D

La réponse du D souligne qu'un GET peut être utilisé pour émettre des commandes à la fois sur le site et sur le même site. Je veux développer cette notion parce que dire "C'est une demande GET - soyez prudent" ne parvient généralement pas à transmettre pourquoi pourrait être un problème.

Une attaque qui peut être faite que d'autres réponses n'ont pas couverte est le déni de service. Considérer ce qui suit:

Vous êtes sur un forum et quelqu'un poste un message contenant un <img src="/logout" /> - cela conduit à tout le monde étant déconnecté lorsque l'image est chargée. Maintenant, aucun des utilisateurs ne peut utiliser le forum tant qu'il voit cette page.

Il s'agit d'un exemple relativement trivial, mais néanmoins c'est un problème potentiel. Pour montrer comment cela pourrait être plus problématique, imaginez que c'est une sorte de site d'actualités ou autre qui affiche les commentaires des utilisateurs sur la page principale et après la connexion, vous y êtes redirigé. Désormais, personne ne peut plus se connecter sans être déconnecté immédiatement.

Jusqu'à présent, il ne s'agit pas d'attaques intersites. Ils peuvent être relativement simplement transformés en cela, cependant - imaginez si Facebook ou un autre site Web populaire autorise une source arbitraire d'images et que vous publiez le <img src="http://yourdomain.com/logout" /> - les gens seront déconnectés sans même être sur yourdomain.com. Cela peut aller de gênant ("Ugh, le site Web demande à nouveau mon mot de passe ") à potentiellement problématique ("Attendez, où est passé tout mon travail non enregistré ? ").

Il est tout à fait possible que ce ne soit même pas la déconnexion que l'image cible - et si c'est http://yourdomain.com/deleteMyUser ce qui fait que les utilisateurs "quittent" le site sans leur accord? Ou peut-être le plus plausible http://yourdomain.com/findPrimes?count=9001 ce qui finira par surcharger votre serveur pour effectuer des calculs lourds?

Ce que je trouve le plus irritant à propos de ce type d'attaque, c'est que ce n'est même pas un problème avec les balises img elles-mêmes - même si votre webapp est attention aux images, celle de quelqu'un d'autre pourrait ne pas l'être. Le cœur du problème est que le lien de déconnexion (ou toute ressource qu'un attaquant pourrait exploiter) peut simplement être invoqué via GET et l'image est simplement vectorielle pour que les navigateurs émettent ce GET. Le problème est que ce n'est pas du tout évident pour beaucoup de développeurs.

17
VLAZ

En plus de ce que toutes les autres réponses ont déjà mentionné, l'image elle-même pourrait être délibérément modifiée de telle manière que l'analyse de la machine exploite la machine utilisateur et permette ainsi l'exécution de code à distance, voir La décompression d'une image JPEG peut-elle simplement déclencher un exploit? =

8
Matija Nalis

Blender fait un très bon point sur les dialogues d'authentification, et korockinout1 a raison sur les attributs on. J'ai cependant un ajout.

Dans certaines situations, vous pouvez utiliser le contrôle des images pour modifier la mise en page de la page et simuler des parties de la page. Ce n'est pas très puissant car je ne peux rien faire de dynamique, mais il peut parfois être utilisé de manière intelligente.

Par exemple, si je peux insérer une balise img dans la page de résultats de recherche en en recherchant une, je pourrais avoir une image contenant de faux résultats de recherche. De cette façon, je pourrais faire ressembler à une recherche d '"OVNI" dans les actualités locales des histoires sur le grand atterrissage extraterrestre de 2016.

Si la vulnérabilité se trouve à l'intérieur d'une balise a qui effectue une action, je pourrais insérer une image imitant d'autres parties de la page. De cette façon, lorsque l'utilisateur clique sur "OK", elle clique sur mon image qui contient une représentation d'un faux bouton "OK", mais fait en fait partie du lien "Supprimer".

Si je peux créer mes propres liens avec des images, cela devient encore meilleur ...

Comme je l'ai dit, ce n'est pas le hack le plus puissant du monde, mais une raison suffisante pour ne pas autoriser les images là où elles ne sont pas nécessaires.

6
Anders