## 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**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/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 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**](https://github.com/wisec/domxsswiki/wiki)
{% endhint %}
**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
```
**Fuentes comunes:**
| [**Redirección abierta**](dom-xss.md#open-redirect) | [**Inyección de Javascript**](dom-xss.md#javascript-injection) | [**Manipulación de datos DOM**](dom-xss.md#dom-data-manipulation) | **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**](dom-xss.md#local-file-path-manipulation) | `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**](dom-xss.md#ajax-request-manipulation) | `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**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` |
| `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` |
| `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**Inyección de JSON del lado del cliente**](dom-xss.md#client-side-sql-injection) |
| **\`\`**[**Manipulación de almacenamiento HTML5**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` |
| `sessionStorage.setItem()` | [**Inyección de XPath**](dom-xss.md#xpath-injection) | `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**](dom-xss.md#cookie-manipulation) |
| `requestFileSystem()` | **\`\`**[**Manipulación de dominio de documento**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` |
| `RegExp()` | `document.domain` | `history.pushState()` | [**Envenenamiento de URL de WebSocket**](dom-xss.md#websocket-url-poisoning) |
| [**Inyección de SQL del lado del cliente**](dom-xss.md#client-side-sql-injection) | [**Manipulación de mensaje web**](dom-xss.md#web-message-manipulation) | `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
* [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized)
## Ejemplos
### Redirección abierta
De: [https://portswigger.net/web-security/dom-based/open-redirection](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](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](../hacking-with-cookies/#session-fixation) (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](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](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](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](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](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](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](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](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](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](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](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](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](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](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](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**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).