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
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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:
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 Abierta | Inyecci贸n de Javascript | Manipulaci贸n de datos DOM | jQuery |
---|---|---|---|
location | eval() | scriptElement.src | add() |
location.host | Function() constructor | 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 | ``Manipulaci贸n de ruta de archivo local | 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() |
``Manipulaci贸n de solicitud Ajax | FileReader.readAsFile() | someDOMElement.backgroundImage | constructor() |
XMLHttpRequest.setRequestHeader() | FileReader.root.getFile() | someDOMElement.cssText | init() |
XMLHttpRequest.open() | FileReader.root.getFile() | someDOMElement.codebase | index() |
XMLHttpRequest.send() | Manipulaci贸n de enlaces | someDOMElement.innerHTML | jQuery.parseHTML() |
jQuery.globalEval() | someDOMElement.href | someDOMElement.outerHTML | $.parseHTML() |
$.globalEval() | someDOMElement.src | someDOMElement.insertAdjacentHTML | Inyecci贸n de JSON del lado del cliente |
``Manipulaci贸n de almacenamiento HTML5 | someDOMElement.action | someDOMElement.onevent | JSON.parse() |
sessionStorage.setItem() | Inyecci贸n de XPath | 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 | ``Manipulaci贸n de Cookies |
requestFileSystem() | ``Manipulaci贸n de dominio de documento | document.implementation.createHTMLDocument() | document.cookie |
RegExp() | document.domain | history.pushState() | Envenenamiento de URL de WebSocket |
Inyecci贸n SQL del lado del cliente | Manipulaci贸n de mensajes web | history.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
- https://github.com/mozilla/eslint-plugin-no-unsanitized
- Extensi贸n de navegador para verificar cada dato que llega a un sink potencial: https://github.com/kevin-mizu/domloggerpp
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:
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:
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:
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:
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.
Link manipulation
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:
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:
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:
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:
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:
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:
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:
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:
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:
requestFileSystem()
RegExp()
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
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.