25 KiB
XSS DOM
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.
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 cadenadocument.referrer
), las cookies del usuario (expuestas por la cadenadocument.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 esdocument.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 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.