
Vulnerabilidades basadas en DOM
En esta sección, describiremos qué es DOM, explicaremos cómo el procesamiento inseguro de datos DOM puede introducir vulnerabilidades y sugeriremos cómo puede prevenir vulnerabilidades basadas en DOM en sus sitios web.
¿Qué es el DOM?
El modelo de objetos de documento (DOM) es la representación jerárquica de los elementos de una página en un navegador web. Los sitios web pueden utilizar JavaScript para manipular los nodos y objetos del DOM, así como sus propiedades. La manipulación de DOM en sí misma no es un problema. De hecho, es una parte integral del funcionamiento de los sitios web modernos. Sin embargo, JavaScript que maneja datos de forma insegura puede permitir varios ataques. Las vulnerabilidades basadas en DOM surgen cuando un sitio web contiene JavaScript que toma un valor controlable por el atacante, conocido como fuente, y lo pasa a una función peligrosa, conocida como sumidero.
Vulnerabilidades del flujo corrupto
Muchas vulnerabilidades basadas en DOM se remontan a problemas con la forma en que el código del lado del cliente manipula los datos controlables por el atacante.
Acunetix es una solución integral de seguridad de aplicaciones web que le ayuda a abordar las vulnerabilidades en todos sus activos web críticos.
Conocer…
¿Qué es el flujo de contaminación?
Para explotar o mitigar estas vulnerabilidades, es importante familiarizarse primero con los conceptos básicos del flujo corrupto entre fuentes y sumideros.
Fuentes
Una fuente es una propiedad de JavaScript que acepta datos potencialmente controlados por un atacante. Un ejemplo de fuente es la location.search
propiedad porque lee la entrada de la cadena de consulta, lo cual es relativamente sencillo de controlar para un atacante. En última instancia, cualquier propiedad que pueda controlar el atacante es una fuente potencial. Esto incluye la URL de referencia (expuesta por la document.referrer
cadena), las cookies del usuario (expuestas por la document.cookie
cadena) y los mensajes web.
Sinks
Un receptor es una función JavaScript u objeto DOM potencialmente peligroso que puede causar efectos indeseables si se le pasan datos controlados por un atacante. Por ejemplo, la eval()
función es un receptor porque procesa el argumento que se le pasa como JavaScript. Un ejemplo de receptor de HTML es document.body.innerHTML
que potencialmente permite a un atacante inyectar HTML malicioso y ejecutar JavaScript arbitrario.
Fundamentalmente, las vulnerabilidades basadas en DOM surgen cuando un sitio web pasa datos de una fuente a un receptor, que luego maneja los datos de forma insegura en el contexto de la sesión del cliente.
La fuente más común es la URL, a la que normalmente se accede con el location
objeto. Un atacante puede construir un enlace para enviar a una víctima a una página vulnerable con una carga útil en la cadena de consulta y fragmentos de la URL. Considere el siguiente código:
goto = location.hash.slice(1)
if (goto.startsWith('https:')) {
location = goto;
}
Esto es vulnerable a la redirección abierta basada en DOM porque el location.hash
código fuente se maneja de forma insegura. Si la URL contiene un fragmento hash que comienza con https:
, este código extrae el valor de la location.hash
propiedad y lo establece como location
propiedad de window
. Un atacante podría aprovechar esta vulnerabilidad construyendo la siguiente URL:
https://www.innocent-website.com/example#https://www.evil-user.net
Cuando una víctima visita esta URL, JavaScript establece el valor de la location
propiedad en https://www.evil-user.net
, lo que redirige automáticamente a la víctima al sitio malicioso. Este comportamiento podría aprovecharse fácilmente para elaborar un ataque de phishing, por ejemplo.
Fuentes comunes
Las siguientes son fuentes típicas que se pueden utilizar para explotar una variedad de vulnerabilidades de flujo corrupto:
document.URL
document.documentURI
document.URLUnencoded
document.baseURI
location
document.cookie
document.referrer
window.name
history.pushState
history.replaceState
localStorage
sessionStorage
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
Database
Los siguientes tipos de datos también se pueden utilizar como fuentes para explotar las vulnerabilidades de flujo corrupto:
¿Qué sumideros pueden provocar vulnerabilidades basadas en DOM?
La siguiente lista proporciona una descripción general rápida de las vulnerabilidades comunes basadas en DOM y un ejemplo de un sumidero que puede conducir a cada una. Para obtener una lista más completa de receptores relevantes, consulte las páginas específicas de vulnerabilidades haciendo clic en los enlaces siguientes.
Vulnerabilidad basada en DOM | Ejemplo de fregadero |
---|---|
LABORATORIOS DOM XSS | document.write() |
LABS de redirección abierta | window.location |
LABORATORIOS de manipulación de cookies | document.cookie |
Inyección de JavaScript | eval() |
Manipulación del dominio de documentos | document.domain |
Envenenamiento de WebSocket-URL | WebSocket() |
Manipulación de enlaces | element.src |
Manipulación de mensajes web | postMessage() |
Manipulación del encabezado de solicitud de Ajax | setRequestHeader() |
Manipulación de la ruta del archivo local | FileReader.readAsText() |
Inyección SQL del lado del cliente | ExecuteSql() |
Manipulación del almacenamiento HTML5 | sessionStorage.setItem() |
Inyección XPath del lado del cliente | document.evaluate() |
Inyección JSON del lado del cliente | JSON.parse() |
Manipulación de datos DOM | element.setAttribute() |
Negación de servicio | RegExp() |
Cómo prevenir vulnerabilidades de flujo corrupto basadas en DOM
No existe una única acción que pueda tomar para eliminar por completo la amenaza de ataques basados en DOM. Sin embargo, en términos generales, la forma más eficaz de evitar las vulnerabilidades basadas en DOM es evitar permitir que los datos de cualquier fuente que no sea de confianza alteren dinámicamente el valor que se transmite a cualquier sumidero.
Si la funcionalidad deseada de la aplicación significa que este comportamiento es inevitable, entonces se deben implementar defensas dentro del código del lado del cliente. En muchos casos, los datos relevantes se pueden validar en una lista blanca, permitiendo solo contenido que se sabe que es seguro. En otros casos, será necesario desinfectar o codificar los datos. Esta puede ser una tarea compleja y, dependiendo del contexto en el que se insertarán los datos, puede implicar una combinación de escape de JavaScript, codificación HTML y codificación URL, en la secuencia adecuada.
Para conocer las medidas que puede tomar para prevenir vulnerabilidades específicas, consulte las páginas de vulnerabilidad correspondientes vinculadas en la tabla anterior.
Golpe DOM
La destrucción de DOM es una técnica avanzada en la que se inyecta HTML en una página para manipular el DOM y, en última instancia, cambiar el comportamiento de JavaScript en el sitio web. La forma más común de destrucción de DOM utiliza un elemento de anclaje para sobrescribir una variable global, que luego la aplicación utiliza de forma insegura, como generando una URL de script dinámica.
NORTH NETWORKS es Distribuidor Oficial y brinda licencias nuevas, renovaciones y servicios profesionales de las herramientas mas importantes.
Pongase en contacto y le ayudaremos a analizar sus requerimientos para poder brindarle la herramienta que mejor se ajuste a sus proyectos.
Si te ha gustado, ¡compártelo con tus amigos!