Vulnerabilidad DOM-based
Las vulnerabilidades DOM-based son un tipo de vulnerabilidad del lado del cliente donde la fuente de los datos (por ejemplo, el URL o el referrer
HTTP) y el punto donde se procesan los datos (el sink) se encuentran en el DOM (Document Object Model) del navegador.
A diferencia de las vulnerabilidades tradicionales (como XSS reflejado o almacenado), en un ataque DOM-based el servidor no procesa directamente el payload malicioso. La vulnerabilidad reside completamente en el código JavaScript del cliente, que toma datos no confiables y los inserta de manera insegura en el HTML de la página.
¿Cómo funciona una vulnerabilidad DOM-based?
El proceso de un ataque DOM-based ocurre enteramente dentro del navegador de la víctima.
Fuente (Source): El navegador lee datos no confiables. Un ejemplo común es el URL (a través de
window.location.href
).Procesamiento del cliente: El código JavaScript de la página toma estos datos de la fuente.
Sumidero (Sink): El script inserta los datos directamente en el DOM de forma insegura. Los sinks comunes son métodos como
document.write()
,innerHTML
, oeval()
.Ejecución del payload: El navegador interpreta y ejecuta el payload malicioso como parte de la página, sin que el servidor intervenga en el proceso.
Ejemplos comunes de DOM-based
Las vulnerabilidades DOM-based suelen manifestarse como XSS (Cross-Site Scripting), pero también pueden presentarse como vulnerabilidades de inyección de URL o de cookies.
Ejemplo de XSS DOM-based
Este es el tipo más conocido. El script a continuación toma el parámetro de la URL y lo inyecta directamente en el HTML.
Código vulnerable:
JavaScript// Código JavaScript en la página web var nombre = new URLSearchParams(window.location.search).get('nombre'); document.getElementById('saludo').innerHTML = 'Hola, ' + nombre + '!';
Ataque:
https://ejemplo.com/pagina.html?nombre=<script>alert('DOM-based XSS');</script>
Resultado: El script toma el
nombre
de la URL e inserta la etiqueta<script>
directamente en elinnerHTML
del elementosaludo
. El navegador ejecuta la alerta, demostrando la vulnerabilidad.
Ejemplo de Redirección Abierta DOM-based
En este caso, la vulnerabilidad se utiliza para redirigir a un usuario a un sitio malicioso.
Código vulnerable:
JavaScript// Script que redirige según un parámetro de la URL var destino = new URLSearchParams(window.location.search).get('destino'); if (destino) { window.location.href = destino; }
Ataque:
https://ejemplo.com/redirigir.html?destino=http://sitio-malicioso.com
Resultado: El script lee el parámetro
destino
y redirige el navegador a una URL controlada por el atacante.
Prevención
La mejor manera de prevenir estas vulnerabilidades es asegurarse de que todo el código JavaScript que manipula el DOM utilice sanitización de datos o se asegure de que la entrada del usuario se procese de manera segura. Algunas prácticas recomendadas incluyen:
Evitar el uso de sinks peligrosos: No usar métodos como
innerHTML
,document.write
oeval
con datos directamente de la URL o de otras fuentes no confiables.Sanitizar y validar la entrada: Si es inevitable usar datos de fuentes no confiables, se deben escapar y validar rigurosamente para eliminar cualquier carácter que pueda ser interpretado como código.
Utilizar frameworks seguros: Las librerías de JavaScript modernas como React o Angular tienen mecanismos de seguridad integrados para prevenir automáticamente este tipo de vulnerabilidades.