DOM XSS

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Vulnerabilidades DOM

Las vulnerabilidades 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 proporciona datos maliciosos.

  • Fuentes son entradas que pueden ser manipuladas por atacantes, incluyendo URLs, cookies y mensajes web.
  • Sumideros son puntos finales potencialmente peligrosos donde los datos maliciosos pueden llevar a efectos adversos, como la ejecuci贸n de scripts.

El riesgo surge cuando los datos fluyen de una fuente a un sumidero sin la validaci贸n o sanitizaci贸n adecuada, lo que permite ataques como XSS.

note

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

Fuentes comunes:

javascript
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

Sinks Comunes:

Redirecci贸n AbiertaInyecci贸n de JavascriptManipulaci贸n de datos DOMjQuery
locationeval()scriptElement.srcadd()
location.hostFunction() constructorscriptElement.textafter()
location.hostnamesetTimeout()scriptElement.textContentappend()
location.hrefsetInterval()scriptElement.innerTextanimate()
location.pathnamesetImmediate()someDOMElement.setAttribute()insertAfter()
location.searchexecCommand()someDOMElement.searchinsertBefore()
location.protocolexecScript()someDOMElement.textbefore()
location.assign()msSetImmediate()someDOMElement.textContenthtml()
location.replace()range.createContextualFragment()someDOMElement.innerTextprepend()
open()crypto.generateCRMFRequest()someDOMElement.outerTextreplaceAll()
domElem.srcdoc``Manipulaci贸n de ruta de archivo localsomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Manipulaci贸n de solicitud AjaxFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Manipulaci贸n de enlacessomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLInyecci贸n de JSON del lado del cliente
``Manipulaci贸n de almacenamiento HTML5someDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()Inyecci贸n de XPathdocument.write()jQuery.parseJSON()
localStorage.setItem()document.evaluate()document.writeln()$.parseJSON()
**[**`Denegaci贸n de Servicio`**](dom-xss.md#denial-of-service)**someDOMElement.evaluate()document.title``Manipulaci贸n de Cookies
requestFileSystem()``Manipulaci贸n de dominio de documentodocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()Envenenamiento de URL de WebSocket
Inyecci贸n SQL del lado del clienteManipulaci贸n de mensajes webhistory.replaceState()WebSocket
executeSql()postMessage()````

El innerHTML sink no acepta elementos script en ning煤n navegador moderno, ni se activar谩n eventos svg onload. Esto significa que necesitar谩s usar elementos alternativos como img o iframe.

Este tipo de XSS es probablemente el m谩s dif铆cil de encontrar, ya que necesitas mirar dentro del c贸digo JS, ver si est谩 usando alg煤n objeto cuyo valor controlas, 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 sink capaz de iniciar 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.

Sinks:

javascript
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 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 sumidero principal asociado con esta vulnerabilidad es:

Sumideros:

javascript
document.cookie

Inyecci贸n de JavaScript

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

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

Sinks:

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

Manipulaci贸n del dominio del documento

From: 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 mismo origen por parte de los navegadores. Cuando dos p谩ginas de diferentes or铆genes establecen su document.domain al mismo valor, pueden interactuar sin restricciones. Aunque los navegadores imponen ciertos l铆mites en los valores asignables a document.domain, impidiendo la asignaci贸n de valores completamente no relacionados con el origen real de la p谩gina, existen excepciones. T铆picamente, los navegadores permiten el uso de dominios hijos o padres.

Sinks:

javascript
document.domain

WebSocket-URL poisoning

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

WebSocket-URL poisoning ocurre cuando un script utiliza datos controlables como la URL objetivo para una conexi贸n WebSocket.

Sinks:

El constructor WebSocket puede llevar a vulnerabilidades de WebSocket-URL poisoning.

From: 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 objetivo de navegaci贸n dentro de la p谩gina actual, como un enlace clicable o la URL de env铆o de un formulario.

Sinks:

javascript
someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulaci贸n de solicitudes Ajax

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

Sinks:

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

Manipulaci贸n de rutas de archivos locales

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

Las vulnerabilidades de manipulaci贸n de rutas de archivos locales surgen cuando un script pasa datos controlables 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.

Sinks:

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

Inyecci贸n SQL del lado del cliente

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

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

Sinks:

javascript
executeSql()

Manipulaci贸n de almacenamiento HTML5

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

Las vulnerabilidades de manipulaci贸n de almacenamiento HTML5 surgen cuando un script almacena datos controlables por el atacante en el almacenamiento HTML5 del navegador web (localStorage o sessionStorage). Aunque 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 DOM, como scripting entre sitios e inyecci贸n de JavaScript.

Sinks:

javascript
sessionStorage.setItem()
localStorage.setItem()

Inyecci贸n XPath

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

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

Sinks:

javascript
document.evaluate()
someDOMElement.evaluate()

Inyecci贸n de JSON del lado del cliente

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

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

Sinks:

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

Manipulaci贸n de mensajes web

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

Las vulnerabilidades de mensajes web surgen cuando un script env铆a datos controlables 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.

Sinks:

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

Manipulaci贸n de datos DOM

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

Las vulnerabilidades de manipulaci贸n de datos DOM surgen cuando un script escribe datos controlables por el atacante en un campo dentro del DOM que se utiliza dentro de la UI visible o la 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 UI del lado del cliente.

Sinks:

javascript
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()

Denial of Service

From: 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 controlables por el atacante de manera insegura a una API problem谩tica de la plataforma. Esto incluye APIs que, al ser invocadas, pueden hacer que la computadora del usuario consuma cantidades excesivas de CPU o espacio en disco. Tales vulnerabilidades pueden tener efectos secundarios significativos, como que el navegador restrinja la funcionalidad del sitio web al rechazar intentos de almacenar datos en localStorage o finalizar scripts ocupados.

Sinks:

javascript
requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks