mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-26 04:53:39 +00:00
327 lines
24 KiB
Markdown
327 lines
24 KiB
Markdown
# DOM XSS
|
|
|
|
{% hint style="success" %}
|
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Compartilhe truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
## Vulnerabilidades DOM
|
|
|
|
Vulnerabilidades DOM ocorrem quando dados de **fontes** controladas por atacantes (como `location.search`, `document.referrer` ou `document.cookie`) são transferidos de forma insegura para **sinks**. Sinks são funções ou objetos (por exemplo, `eval()`, `document.body.innerHTML`) que podem executar ou renderizar conteúdo prejudicial se receberem dados maliciosos.
|
|
|
|
* **Fontes** são entradas que podem ser manipuladas por atacantes, incluindo URLs, cookies e mensagens da web.
|
|
* **Sinks** são pontos finais potencialmente perigosos onde dados maliciosos podem levar a efeitos adversos, como execução de scripts.
|
|
|
|
O risco surge quando os dados fluem de uma fonte para um sink sem a devida validação ou sanitização, permitindo ataques como XSS.
|
|
|
|
{% hint style="info" %}
|
|
**Você pode encontrar uma lista mais atualizada de fontes e sinks em** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki)
|
|
{% endhint %}
|
|
|
|
**Fontes comuns:**
|
|
```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
|
|
```
|
|
**Common Sinks:**
|
|
|
|
| [**Open Redirect**](dom-xss.md#open-redirect) | [**Javascript Injection**](dom-xss.md#javascript-injection) | [**DOM-data manipulation**](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` | **\`\`**[**Local file-path manipulation**](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()` |
|
|
| **\`\`**[**Ajax request manipulation**](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()` | [**Link manipulation**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` |
|
|
| `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` |
|
|
| `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**Client-side JSON injection**](dom-xss.md#client-side-sql-injection) |
|
|
| **\`\`**[**HTML5-storage manipulation**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` |
|
|
| `sessionStorage.setItem()` | [**XPath injection**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` |
|
|
| `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` |
|
|
| **``**[**`Denial of Service`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Cookie manipulation**](dom-xss.md#cookie-manipulation) |
|
|
| `requestFileSystem()` | **\`\`**[**Document-domain manipulation**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` |
|
|
| `RegExp()` | `document.domain` | `history.pushState()` | [**WebSocket-URL poisoning**](dom-xss.md#websocket-url-poisoning) |
|
|
| [**Client-Side SQl injection**](dom-xss.md#client-side-sql-injection) | [**Web-message manipulation**](dom-xss.md#web-message-manipulation) | `history.replaceState()` | `WebSocket` |
|
|
| `executeSql()` | `postMessage()` | \`\` | \`\` |
|
|
|
|
O **`innerHTML`** sink não aceita elementos `script` em nenhum navegador moderno, nem eventos `svg onload` serão acionados. Isso significa que você precisará usar elementos alternativos como `img` ou `iframe`.
|
|
|
|
Esse tipo de XSS é provavelmente o **mais difícil de encontrar**, pois você precisa olhar dentro do código JS, ver se está **usando** algum objeto cujo **valor você controla**, e nesse caso, ver se há **alguma maneira de abusar** disso para executar JS arbitrário.
|
|
|
|
## Tools to find them
|
|
|
|
* [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized)
|
|
* Extensão de navegador para verificar todos os dados que chegam a um sink potencial: [https://github.com/kevin-mizu/domloggerpp](https://github.com/kevin-mizu/domloggerpp)
|
|
|
|
## Examples
|
|
|
|
### Open Redirect
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection)
|
|
|
|
**Vulnerabilidades de redirecionamento aberto no DOM** ocorrem quando um script grava dados, que um atacante pode controlar, em um sink capaz de iniciar navegação entre domínios.
|
|
|
|
É crucial entender que executar código arbitrário, como **`javascript:alert(1)`**, é possível se você tiver controle sobre o início da URL onde o redirecionamento ocorre.
|
|
|
|
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()
|
|
```
|
|
### Manipulação de cookies
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation)
|
|
|
|
Vulnerabilidades de manipulação de cookies baseadas em DOM ocorrem quando um script incorpora dados, que podem ser controlados por um atacante, no valor de um cookie. Essa vulnerabilidade pode levar a um comportamento inesperado da página da web se o cookie for utilizado dentro do site. Além disso, pode ser explorada para realizar um ataque de fixação de sessão se o cookie estiver envolvido no rastreamento de sessões de usuários. O principal sink associado a essa vulnerabilidade é:
|
|
|
|
Sinks:
|
|
```javascript
|
|
document.cookie
|
|
```
|
|
### Injeção de JavaScript
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection)
|
|
|
|
As vulnerabilidades de injeção de JavaScript baseadas em DOM são criadas quando um script executa dados, que podem ser controlados por um atacante, como código JavaScript.
|
|
|
|
Sinks:
|
|
```javascript
|
|
eval()
|
|
Function() constructor
|
|
setTimeout()
|
|
setInterval()
|
|
setImmediate()
|
|
execCommand()
|
|
execScript()
|
|
msSetImmediate()
|
|
range.createContextualFragment()
|
|
crypto.generateCRMFRequest()
|
|
```
|
|
### Manipulação de domínio de documento
|
|
|
|
From: [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation)
|
|
|
|
**Vulnerabilidades de manipulação de domínio de documento** ocorrem quando um script define a propriedade `document.domain` usando dados que um atacante pode controlar.
|
|
|
|
A propriedade `document.domain` desempenha um **papel chave** na **aplicação** da **política de mesma origem** pelos navegadores. Quando duas páginas de origens diferentes definem seu `document.domain` para o **mesmo valor**, elas podem interagir sem restrições. Embora os navegadores imponham certos **limites** nos valores atribuíveis a `document.domain`, impedindo a atribuição de valores completamente não relacionados à origem real da página, existem exceções. Normalmente, os navegadores permitem o uso de **domínios pai** ou **filho**.
|
|
|
|
Sinks:
|
|
```javascript
|
|
document.domain
|
|
```
|
|
### WebSocket-URL poisoning
|
|
|
|
From: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](https://portswigger.net/web-security/dom-based/websocket-url-poisoning)
|
|
|
|
**WebSocket-URL poisoning** ocorre quando um script utiliza **dados controláveis como a URL de destino** para uma conexão WebSocket.
|
|
|
|
Sinks:
|
|
|
|
O construtor `WebSocket` pode levar a vulnerabilidades de WebSocket-URL poisoning.
|
|
|
|
### Link manipulation
|
|
|
|
From: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation)
|
|
|
|
**Vulnerabilidades de manipulação de link baseadas em DOM** surgem quando um script escreve **dados controláveis pelo atacante em um alvo de navegação** dentro da página atual, como um link clicável ou a URL de submissão de um formulário.
|
|
|
|
Sinks:
|
|
```javascript
|
|
someDOMElement.href
|
|
someDOMElement.src
|
|
someDOMElement.action
|
|
```
|
|
### Manipulação de requisições Ajax
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation)
|
|
|
|
**Vulnerabilidades de manipulação de requisições Ajax** surgem quando um script escreve **dados controláveis pelo atacante em uma requisição Ajax** que é emitida usando um objeto `XmlHttpRequest`.
|
|
|
|
Sinks:
|
|
```javascript
|
|
XMLHttpRequest.setRequestHeader()
|
|
XMLHttpRequest.open()
|
|
XMLHttpRequest.send()
|
|
jQuery.globalEval()
|
|
$.globalEval()
|
|
```
|
|
### Manipulação de caminho de arquivo local
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation)
|
|
|
|
**Vulnerabilidades de manipulação de caminho de arquivo local** surgem quando um script passa **dados controláveis pelo atacante para uma API de manipulação de arquivos** como o parâmetro `filename`. Essa vulnerabilidade pode ser explorada por um atacante para construir uma URL que, se visitada por outro usuário, poderia levar o **navegador do usuário a abrir ou gravar um arquivo local arbitrário**.
|
|
|
|
Sinks:
|
|
```javascript
|
|
FileReader.readAsArrayBuffer()
|
|
FileReader.readAsBinaryString()
|
|
FileReader.readAsDataURL()
|
|
FileReader.readAsText()
|
|
FileReader.readAsFile()
|
|
FileReader.root.getFile()
|
|
FileReader.root.getFile()
|
|
```
|
|
### Injeção SQL do Lado do Cliente
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/client-side-sql-injection](https://portswigger.net/web-security/dom-based/client-side-sql-injection)
|
|
|
|
**Vulnerabilidades de injeção SQL do lado do cliente** ocorrem quando um script incorpora **dados controláveis pelo atacante em uma consulta SQL do lado do cliente de maneira insegura**.
|
|
|
|
Sinks:
|
|
```javascript
|
|
executeSql()
|
|
```
|
|
### Manipulação de armazenamento HTML5
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation)
|
|
|
|
**Vulnerabilidades de manipulação de armazenamento HTML5** surgem quando um script **armazenar dados controláveis pelo atacante no armazenamento HTML5 do navegador da web** (`localStorage` ou `sessionStorage`). Embora essa ação não seja inerentemente uma vulnerabilidade de segurança, torna-se problemática se a aplicação posteriormente **ler os dados armazenados e processá-los de forma insegura**. Isso poderia permitir que um atacante aproveitasse o mecanismo de armazenamento para conduzir outros ataques baseados em DOM, como cross-site scripting e injeção de JavaScript.
|
|
|
|
Sinks:
|
|
```javascript
|
|
sessionStorage.setItem()
|
|
localStorage.setItem()
|
|
```
|
|
### Injeção XPath
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](https://portswigger.net/web-security/dom-based/client-side-xpath-injection)
|
|
|
|
**Vulnerabilidades de injeção XPath baseadas em DOM** ocorrem quando um script incorpora **dados controláveis pelo atacante em uma consulta XPath**.
|
|
|
|
Sinks:
|
|
```javascript
|
|
document.evaluate()
|
|
someDOMElement.evaluate()
|
|
```
|
|
### Injeção de JSON do lado do cliente
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection)
|
|
|
|
**Vulnerabilidades de injeção de JSON baseadas em DOM** ocorrem quando um script incorpora **dados controláveis pelo atacante em uma string que é analisada como uma estrutura de dados JSON e, em seguida, processada pela aplicação**.
|
|
|
|
Sinks:
|
|
```javascript
|
|
JSON.parse()
|
|
jQuery.parseJSON()
|
|
$.parseJSON()
|
|
```
|
|
### Manipulação de mensagens da web
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation)
|
|
|
|
**Vulnerabilidades de mensagens da web** surgem quando um script envia **dados controláveis pelo atacante como uma mensagem da web para outro documento** dentro do navegador. Um **exemplo** de manipulação vulnerável de mensagens da web pode ser encontrado na [Academia de Segurança da Web da PortSwigger](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source).
|
|
|
|
Sinks:
|
|
|
|
O método `postMessage()` para enviar mensagens da web pode levar a vulnerabilidades se o ouvinte de eventos para receber mensagens manipular os dados recebidos de maneira insegura.
|
|
|
|
### Manipulação de dados DOM
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation)
|
|
|
|
**Vulnerabilidades de manipulação de dados DOM** surgem quando um script escreve **dados controláveis pelo atacante em um campo dentro do DOM** que é utilizado na UI visível ou na lógica do lado do cliente. Essa vulnerabilidade pode ser explorada por um atacante para construir uma URL que, se visitada por outro usuário, pode alterar a aparência ou o comportamento da UI do lado do 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()
|
|
```
|
|
### Negação de Serviço
|
|
|
|
From: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service)
|
|
|
|
**Vulnerabilidades de negação de serviço baseadas em DOM** ocorrem quando um script passa **dados controláveis pelo atacante de forma insegura para uma API problemática da plataforma**. Isso inclui APIs que, quando invocadas, podem fazer com que o computador do usuário consuma **quantidades excessivas de CPU ou espaço em disco**. Essas vulnerabilidades podem ter efeitos colaterais significativos, como o navegador restringindo a funcionalidade do site ao rejeitar tentativas de armazenar dados em `localStorage` ou encerrando scripts ocupados.
|
|
|
|
Sinks:
|
|
```javascript
|
|
requestFileSystem()
|
|
RegExp()
|
|
```
|
|
## Dom Clobbering
|
|
|
|
{% content-ref url="dom-clobbering.md" %}
|
|
[dom-clobbering.md](dom-clobbering.md)
|
|
{% endcontent-ref %}
|
|
|
|
{% hint style="success" %}
|
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|
|
{% endhint %}
|