DOM XSS

Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (HackTricks AWS Red Team Expert)!

Vulnerabilidades del DOM

Las vulnerabilidades del DOM ocurren cuando los datos de fuentes controladas por atacantes (como location.search, document.referrer o document.cookie) se transfieren de manera insegura a sumideros. Los sumideros son funciones u objetos (por ejemplo, eval(), document.body.innerHTML) que pueden ejecutar o renderizar contenido dañino si se les proporcionan datos maliciosos.

  • Las fuentes son entradas que pueden ser manipuladas por atacantes, incluidas las URL, las cookies y los mensajes web.

  • Los sumideros son puntos finales potencialmente peligrosos donde los datos maliciosos pueden provocar efectos adversos, como la ejecución de scripts.

El riesgo surge cuando los datos fluyen desde una fuente hacia un sumidero sin una validación o saneamiento adecuados, lo que permite ataques como XSS.

Puedes encontrar una lista más actualizada de fuentes y sumideros en https://github.com/wisec/domxsswiki/wiki

Fuentes comunes:

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

Fuentes comunes:

jQuery

location

eval()

scriptElement.src

add()

location.host

Constructor de Function()

scriptElement.text

after()

location.hostname

setTimeout()

scriptElement.textContent

append()

location.href

setInterval()

scriptElement.innerText

animate()

location.pathname

setImmediate()

someDOMElement.setAttribute()

insertAfter()

location.search

execCommand()

someDOMElement.search

insertBefore()

location.protocol

execScript()

someDOMElement.text

before()

location.assign()

msSetImmediate()

someDOMElement.textContent

html()

location.replace()

range.createContextualFragment()

someDOMElement.innerText

prepend()

open()

crypto.generateCRMFRequest()

someDOMElement.outerText

replaceAll()

domElem.srcdoc

someDOMElement.value

replaceWith()

XMLHttpRequest.open()

FileReader.readAsArrayBuffer()

someDOMElement.name

wrap()

XMLHttpRequest.send()

FileReader.readAsBinaryString()

someDOMElement.target

wrapInner()

jQuery.ajax()

FileReader.readAsDataURL()

someDOMElement.method

wrapAll()

$.ajax()

FileReader.readAsText()

someDOMElement.type

has()

FileReader.readAsFile()

someDOMElement.backgroundImage

constructor()

XMLHttpRequest.setRequestHeader()

FileReader.root.getFile()

someDOMElement.cssText

init()

XMLHttpRequest.open()

FileReader.root.getFile()

someDOMElement.codebase

index()

XMLHttpRequest.send()

someDOMElement.innerHTML

jQuery.parseHTML()

jQuery.globalEval()

someDOMElement.href

someDOMElement.outerHTML

$.parseHTML()

$.globalEval()

someDOMElement.src

someDOMElement.insertAdjacentHTML

someDOMElement.action

someDOMElement.onevent

JSON.parse()

sessionStorage.setItem()

document.write()

jQuery.parseJSON()

localStorage.setItem()

document.evaluate()

document.writeln()

$.parseJSON()

**[**`Denegación de servicio`**](dom-xss.md#denial-of-service)**

someDOMElement.evaluate()

document.title

requestFileSystem()

document.implementation.createHTMLDocument()

document.cookie

RegExp()

document.domain

history.pushState()

history.replaceState()

WebSocket

executeSql()

postMessage()

``

``

El sumidero innerHTML no acepta elementos script en ningún navegador moderno, ni se activarán los eventos svg onload. Esto significa que necesitarás usar elementos alternativos como img o `iframe.

Este tipo de XSS probablemente sea el más difícil de encontrar, ya que necesitas revisar el código JS, ver si está usando algún objeto cuyo valor puedas controlar, y en ese caso, ver si hay alguna forma de abusar de él para ejecutar JS arbitrario.

Herramientas para encontrarlos

Ejemplos

Redirección abierta

Desde: https://portswigger.net/web-security/dom-based/open-redirection

Las vulnerabilidades de redirección abierta en el DOM ocurren cuando un script escribe datos, que un atacante puede controlar, en un sumidero capaz de iniciar la navegación entre dominios.

Es crucial entender que ejecutar código arbitrario, como javascript:alert(1), es posible si tienes control sobre el inicio de la URL donde ocurre la redirección.

Sumideros:

location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
domElem.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()

Manipulación de cookies

Desde: https://portswigger.net/web-security/dom-based/cookie-manipulation

Las vulnerabilidades de manipulación de cookies basadas en el DOM ocurren cuando un script incorpora datos, que pueden ser controlados por un atacante, en el valor de una cookie. Esta vulnerabilidad puede llevar a un comportamiento inesperado de la página web si la cookie se utiliza dentro del sitio. Además, puede ser explotada para llevar a cabo un ataque de fijación de sesión si la cookie está involucrada en el seguimiento de sesiones de usuario. El principal punto de fuga asociado con esta vulnerabilidad es:

Puntos de fuga:

document.cookie

Inyección de JavaScript

Desde: https://portswigger.net/web-security/dom-based/javascript-injection

Las vulnerabilidades de inyección de JavaScript basadas en el DOM se crean cuando un script ejecuta datos, los cuales pueden ser controlados por un atacante, como código JavaScript.

Fuentes:

eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

Manipulación del dominio del documento

Desde: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Las vulnerabilidades de manipulación del dominio del documento ocurren cuando un script establece la propiedad document.domain utilizando datos que un atacante puede controlar.

La propiedad document.domain juega un papel clave en la aplicación de la política de la misma procedencia por parte de los navegadores. Cuando dos páginas de orígenes diferentes establecen su document.domain en el mismo valor, pueden interactuar sin restricciones. Aunque los navegadores imponen ciertos límites en los valores asignables a document.domain, evitando la asignación de valores completamente no relacionados con el origen real de la página, existen excepciones. Normalmente, los navegadores permiten el uso de dominios secundarios o padre.

Fuentes:

document.domain

Envenenamiento de URL de WebSocket

Desde: https://portswigger.net/web-security/dom-based/websocket-url-poisoning

El envenenamiento de URL de WebSocket ocurre cuando un script utiliza datos controlables como la URL de destino para una conexión WebSocket.

Fuentes:

El constructor WebSocket puede llevar a vulnerabilidades de envenenamiento de URL de WebSocket.

Manipulación de enlaces

Desde: https://portswigger.net/web-security/dom-based/link-manipulation

Las vulnerabilidades de manipulación de enlaces basadas en DOM surgen cuando un script escribe datos controlables por el atacante en un destino de navegación dentro de la página actual, como un enlace clickeable o la URL de envío de un formulario.

Fuentes:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulación de solicitudes Ajax

Desde: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Las vulnerabilidades de manipulación de solicitudes Ajax surgen cuando un script escribe datos controlables por el atacante en una solicitud Ajax que se emite utilizando un objeto XmlHttpRequest.

Fuentes:

XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()

Manipulación de ruta de archivo local

Desde: https://portswigger.net/web-security/dom-based/local-file-path-manipulation

Las vulnerabilidades de manipulación de ruta de archivo local surgen cuando un script pasa datos controlados por el atacante a una API de manejo de archivos como el parámetro filename. Esta vulnerabilidad puede ser explotada por un atacante para construir una URL que, si es visitada por otro usuario, podría llevar a que el navegador del usuario abra o escriba un archivo local arbitrario.

Sumideros:

FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()

Inyección de SQL en el lado del cliente

Desde: https://portswigger.net/web-security/dom-based/client-side-sql-injection

Las vulnerabilidades de inyección de SQL en el lado del cliente ocurren cuando un script incorpora datos controlados por el atacante en una consulta de SQL en el lado del cliente de una manera insegura.

Sinks:

executeSql()

Manipulación de almacenamiento HTML5

Desde: https://portswigger.net/web-security/dom-based/html5-storage-manipulation

Las vulnerabilidades de manipulación de almacenamiento HTML5 surgen cuando un script almacena datos controlados por el atacante en el almacenamiento HTML5 del navegador web (localStorage o sessionStorage). Si bien esta acción no es inherentemente una vulnerabilidad de seguridad, se vuelve problemática si la aplicación posteriormente lee los datos almacenados y los procesa de manera insegura. Esto podría permitir a un atacante aprovechar el mecanismo de almacenamiento para llevar a cabo otros ataques basados en el DOM, como la ejecución de scripts entre sitios e inyección de JavaScript.

Fuentes:

sessionStorage.setItem()
localStorage.setItem()

Inyección de XPath

Desde: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

Las vulnerabilidades de inyección de XPath basadas en DOM ocurren cuando un script incorpora datos controlados por el atacante en una consulta XPath.

Fuentes:

document.evaluate()
someDOMElement.evaluate()

Inyección de JSON en el lado del cliente

Desde: https://portswigger.net/web-security/dom-based/client-side-json-injection

Las vulnerabilidades de inyección de JSON basadas en el DOM ocurren cuando un script incorpora datos controlados por el atacante en una cadena que se analiza como una estructura de datos JSON y luego es procesada por la aplicación.

Sinks:

JSON.parse()
jQuery.parseJSON()
$.parseJSON()

Manipulación de mensajes web

Desde: https://portswigger.net/web-security/dom-based/web-message-manipulation

Las vulnerabilidades de mensajes web surgen cuando un script envía datos controlados por el atacante como un mensaje web a otro documento dentro del navegador. Un ejemplo de manipulación de mensajes web vulnerable se puede encontrar en la Academia de Seguridad Web de PortSwigger.

Fuentes:

El método postMessage() para enviar mensajes web puede llevar a vulnerabilidades si el event listener para recibir mensajes maneja los datos entrantes de una manera insegura.

Manipulación de datos del DOM

Desde: https://portswigger.net/web-security/dom-based/dom-data-manipulation

Las vulnerabilidades de manipulación de datos del DOM surgen cuando un script escribe datos controlados por el atacante en un campo dentro del DOM que se utiliza en la interfaz de usuario visible o lógica del lado del cliente. Esta vulnerabilidad puede ser explotada por un atacante para construir una URL que, si es visitada por otro usuario, puede alterar la apariencia o el comportamiento de la interfaz de usuario del lado del cliente.

Fuentes:

scriptElement.src
scriptElement.text
scriptElement.textContent
scriptElement.innerText
someDOMElement.setAttribute()
someDOMElement.search
someDOMElement.text
someDOMElement.textContent
someDOMElement.innerText
someDOMElement.outerText
someDOMElement.value
someDOMElement.name
someDOMElement.target
someDOMElement.method
someDOMElement.type
someDOMElement.backgroundImage
someDOMElement.cssText
someDOMElement.codebase
document.title
document.implementation.createHTMLDocument()
history.pushState()
history.replaceState()

Denegación de Servicio

Desde: https://portswigger.net/web-security/dom-based/denial-of-service

Las vulnerabilidades de denegación de servicio basadas en DOM ocurren cuando un script pasa datos controlados por el atacante de manera insegura a una API de plataforma problemática. Esto incluye APIs que, al ser invocadas, pueden hacer que la computadora del usuario consuma cantidades excesivas de CPU o espacio en disco. Estas vulnerabilidades pueden tener efectos secundarios significativos, como el navegador restringiendo la funcionalidad del sitio web al rechazar intentos de almacenar datos en localStorage o al terminar scripts ocupados.

Fuentes:

requestFileSystem()
RegExp()

Dom Clobbering

pageDom Clobbering
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Última actualización