hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

25 KiB

XSS DOM

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Vulnerabilidades DOM

Fuentes

Una fuente es una propiedad de JavaScript que acepta datos que potencialmente pueden ser controlados por un atacante. Un ejemplo de fuente es la propiedad location.search porque lee la entrada de la cadena de consulta, que es relativamente simple de controlar para un atacante. En última instancia, cualquier propiedad que pueda ser controlada por el atacante es una fuente potencial. Esto incluye la URL de referencia (expuesta por la cadena document.referrer), las cookies del usuario (expuestas por la cadena document.cookie) y los mensajes web.

Sumideros

Un sumidero es una función o objeto DOM potencialmente peligroso que puede causar efectos no deseados si se pasa a él datos controlados por un atacante. Por ejemplo, la función eval() es un sumidero porque procesa el argumento que se le pasa como JavaScript. Un ejemplo de sumidero HTML es document.body.innerHTML porque 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 sumidero, que luego maneja los datos de manera insegura en el contexto de la sesión del cliente.

{% hint style="info" %} Puede encontrar una lista más actualizada de fuentes y sumideros en https://github.com/wisec/domxsswiki/wiki {% endhint %}

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:

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 enlace 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 de SQL del lado del cliente Manipulación de mensaje web history.replaceState() WebSocket
executeSql() postMessage() `` ``

El innerHTML sink no acepta elementos script en ningún navegador moderno, ni se activarán los eventos svg onload. Esto significa que deberá utilizar elementos alternativos como img o iframe.

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

Herramientas para encontrarlos

Ejemplos

Redirección abierta

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

Cómo

Las vulnerabilidades de redirección abierta basadas en DOM surgen cuando un script escribe datos controlados por el atacante en un sink que puede desencadenar una navegación entre dominios.

Recuerde que si puede iniciar la URL a la que se va a redirigir a la víctima, podría ejecutar código arbitrario como: javascript:alert(1).

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

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

Cómo

Las vulnerabilidades de manipulación de cookies basadas en DOM surgen cuando un script escribe datos controlados por el atacante en el valor de una cookie.
Esto podría ser abusado para hacer que la página se comporte de manera inesperada (si la cookie se usa en la web) o para realizar un ataque de fijación de sesión (si la cookie se usa para rastrear la sesión del usuario).

Destinos

document.cookie

Inyección de JavaScript

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

Cómo

Las vulnerabilidades de inyección de JavaScript basadas en DOM surgen cuando un script ejecuta datos controlados por el atacante como JavaScript.

Destinos

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

Manipulación del dominio del documento

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

Cómo

Las vulnerabilidades de manipulación del dominio del documento surgen cuando un script utiliza datos controlados por el atacante para establecer la propiedad document.domain.

La propiedad document.domain es utilizada por los navegadores en su aplicación de la política de mismo origen. Si dos páginas de diferentes orígenes establecen explícitamente el mismo valor de document.domain, entonces esas dos páginas pueden interactuar de manera no restringida.
Los navegadores generalmente imponen algunas restricciones en los valores que se pueden asignar a document.domain, y pueden evitar el uso de valores completamente diferentes al origen real de la página. Pero esto no siempre ocurre y generalmente permiten usar dominios secundarios o padres.

Destinos

document.domain

Envenenamiento de URL de WebSocket

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

Cómo

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

Sumideros

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

Manipulación de enlaces

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

Cómo

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.

Sumideros

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulación de solicitudes Ajax

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

Cómo

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

Fugas

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

Manipulación de ruta de archivo local

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

Cómo

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. Un atacante puede usar esta vulnerabilidad para construir una URL que, si es visitada por otro usuario, hará que el navegador del usuario abra/escriba un archivo local arbitrario.

Destinos

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

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

Cómo

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

Destinos

executeSql()

Manipulación de almacenamiento HTML5

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

Cómo

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 (ya sea localStorage o sessionStorage).
Este comportamiento en sí mismo no constituye una vulnerabilidad de seguridad. Sin embargo, si la aplicación posteriormente lee los datos del almacenamiento y los procesa de manera insegura, un atacante puede aprovechar el mecanismo de almacenamiento para entregar otros ataques basados en DOM, como la inyección de JavaScript y el cross-site scripting.

Sinks

sessionStorage.setItem()
localStorage.setItem()

Inyección de XPath

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

Cómo

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

Destinos

document.evaluate()
someDOMElement.evaluate()

Inyección de JSON en el lado del cliente

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

Cómo

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

Destinos

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

Manipulación de mensajes web

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

Cómo

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.
Ejemplo de manipulación de mensajes web vulnerable en https://portswigger.net/web-security/dom-based/controlling-the-web-message-source

Destinos

El método postMessage() para enviar mensajes web puede llevar a vulnerabilidades si el evento de escucha 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

Cómo

Las vulnerabilidades de manipulación de datos 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 en la lógica del lado del cliente. Un atacante puede usar esta vulnerabilidad para construir una URL que, si es visitada por otro usuario, modificará la apariencia o el comportamiento de la interfaz de usuario del lado del cliente.

Destinos

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

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

Cómo

Las vulnerabilidades de denegación de servicio basadas en DOM surgen cuando un script pasa datos controlados por el atacante de manera insegura a una API problemática de la plataforma, como una API cuya invocación puede hacer que la computadora del usuario consuma cantidades excesivas de CPU o espacio en disco. Esto puede resultar en efectos secundarios si el navegador restringe la funcionalidad del sitio web, por ejemplo, rechazando intentos de almacenar datos en localStorage o matando scripts ocupados.

Sumideros

requestFileSystem()
RegExp()

Dom Clobbering

{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥