mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-22 11:03:24 +00:00
357 lines
25 KiB
Markdown
357 lines
25 KiB
Markdown
## XSS DOM
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## **Vulnerabilidades DOM XSS**
|
|
|
|
> **Fontes**
|
|
>
|
|
> Uma fonte é uma propriedade JavaScript que aceita dados potencialmente controlados pelo atacante. Um exemplo de fonte é a propriedade `location.search` porque ela lê a entrada da string de consulta, que é relativamente simples para um atacante controlar. Em última análise, qualquer propriedade que possa ser controlada pelo atacante é uma fonte potencial. Isso inclui o URL de referência (exposto pela string `document.referrer`), os cookies do usuário (expostos pela string `document.cookie`) e mensagens da web.
|
|
|
|
> **Drenos**
|
|
>
|
|
> Um dreno é uma função JavaScript ou objeto DOM potencialmente perigoso que pode causar efeitos indesejáveis se dados controlados pelo atacante forem passados para ele. Por exemplo, a função `eval()` é um dreno porque processa o argumento que lhe é passado como JavaScript. Um exemplo de dreno HTML é `document.body.innerHTML` porque potencialmente permite que um atacante injete HTML malicioso e execute JavaScript arbitrário.
|
|
|
|
Fundamentalmente, as vulnerabilidades baseadas em DOM surgem quando um site **passa dados de uma fonte para um dreno**, que então manipula os dados de maneira insegura no contexto da sessão do cliente.
|
|
|
|
{% hint style="info" %}
|
|
**Você pode encontrar uma lista mais atualizada de fontes e drenos 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
|
|
```
|
|
**Sinks Comuns:**
|
|
|
|
| [**Redirecionamento Aberto**](dom-xss.md#open-redirect) | [**Injeção de Javascript**](dom-xss.md#javascript-injection) | [**Manipulação de Dados 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` | **\`\`**[**Manipulação de Caminho de Arquivo 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()` |
|
|
| **\`\`**[**Manipulação de Requisição 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()` | [**Manipulação de Link**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` |
|
|
| `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` |
|
|
| `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**Injeção de JSON do lado do cliente**](dom-xss.md#client-side-sql-injection) |
|
|
| **\`\`**[**Manipulação de Armazenamento HTML5**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` |
|
|
| `sessionStorage.setItem()` | [**Injeção de XPath**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` |
|
|
| `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` |
|
|
| **``**[**`Negação de Serviço`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Manipulação de Cookie**](dom-xss.md#cookie-manipulation) |
|
|
| `requestFileSystem()` | **\`\`**[**Manipulação de Domínio de Documento**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` |
|
|
| `RegExp()` | `document.domain` | `history.pushState()` | [**Envenenamento de URL WebSocket**](dom-xss.md#websocket-url-poisoning) |
|
|
| [**Injeção de SQL do lado do cliente**](dom-xss.md#client-side-sql-injection) | [**Manipulação de Mensagem Web**](dom-xss.md#web-message-manipulation) | `history.replaceState()` | `WebSocket` |
|
|
| `executeSql()` | `postMessage()` | \`\` | \`\` |
|
|
|
|
O **sink `innerHTML`** não aceita elementos `script` em nenhum navegador moderno, nem os eventos `svg onload` serão disparados. 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 ele está **usando** algum objeto cujo **valor você controla**, e nesse caso, ver se há **alguma maneira de abusar** dele para executar JS arbitrário.
|
|
|
|
## Ferramentas para encontrá-los
|
|
|
|
* [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized)
|
|
|
|
## Exemplos
|
|
|
|
### Redirecionamento Aberto
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de redirecionamento aberto baseadas em DOM surgem quando um script grava dados controlados pelo atacante em um sink que pode acionar navegação entre domínios.
|
|
|
|
Lembre-se de que **se você puder iniciar a URL** para onde a vítima será **redirecionada**, você poderá executar **código arbitrário** 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()
|
|
```
|
|
### Manipulação de Cookies
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de manipulação de cookies baseadas em DOM ocorrem quando um script escreve **dados controláveis pelo atacante no valor de um cookie**.\
|
|
Isso pode ser abusado para fazer com que a página se comporte de maneira inesperada (se o cookie for usado na web) ou para realizar um ataque de [fixação de sessão](../hacking-with-cookies/#session-fixation) (se o cookie for usado para rastrear a sessão do usuário).
|
|
|
|
#### Pontos de Injeção
|
|
```
|
|
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)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de injeção de JavaScript baseadas em DOM ocorrem quando um script executa **dados controlados pelo atacante como JavaScript**.
|
|
|
|
#### Pontos de Injeção (Sinks)
|
|
```
|
|
eval()
|
|
Function() constructor
|
|
setTimeout()
|
|
setInterval()
|
|
setImmediate()
|
|
execCommand()
|
|
execScript()
|
|
msSetImmediate()
|
|
range.createContextualFragment()
|
|
crypto.generateCRMFRequest()
|
|
```
|
|
### Manipulação de document-domain
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de manipulação de document-domain surgem quando um script usa dados controlados pelo atacante para definir a propriedade **`document.domain`**.
|
|
|
|
A propriedade `document.domain` é usada pelos navegadores em sua **aplicação** da **política de mesma origem**. Se **duas páginas** de **origens diferentes** definirem explicitamente o **mesmo valor de `document.domain`**, então essas duas páginas podem **interagir de maneiras não restritas**.\
|
|
Os navegadores **geralmente impõem algumas restrições** aos valores que podem ser atribuídos a `document.domain` e podem impedir o uso de valores completamente diferentes da origem real da página. **Mas isso nem sempre ocorre** e geralmente **permitem o uso de domínios filho** ou **pai**.
|
|
|
|
#### Sinks
|
|
```
|
|
document.domain
|
|
```
|
|
### Envenenamento 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)
|
|
|
|
#### Como
|
|
|
|
O envenenamento de URL de WebSocket ocorre quando um script usa **dados controláveis como URL de destino** de uma conexão WebSocket.
|
|
|
|
#### Sinks
|
|
|
|
O construtor `WebSocket` pode levar a vulnerabilidades de envenenamento de URL de WebSocket.
|
|
|
|
### Manipulação de link
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de manipulação de link baseadas em DOM surgem quando um script escreve **dados controláveis pelo atacante em um destino de navegação** dentro da página atual, como um link clicável ou a URL de envio de um formulário.
|
|
|
|
#### Sinks
|
|
```
|
|
someDOMElement.href
|
|
someDOMElement.src
|
|
someDOMElement.action
|
|
```
|
|
### Manipulação de requisição Ajax
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de manipulação de requisição Ajax surgem quando um script escreve **dados controláveis pelo atacante em uma requisição Ajax** que é emitida usando um objeto `XmlHttpRequest`.
|
|
|
|
#### Sinks
|
|
```
|
|
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)
|
|
|
|
#### Como
|
|
|
|
As 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 arquivo como parâmetro `filename`. Um atacante pode usar essa vulnerabilidade para construir uma URL que, se visitada por outro usuário, fará com que o **navegador do usuário abra/escreva um arquivo local arbitrário**.
|
|
|
|
#### Pontos de vazamento
|
|
```
|
|
FileReader.readAsArrayBuffer()
|
|
FileReader.readAsBinaryString()
|
|
FileReader.readAsDataURL()
|
|
FileReader.readAsText()
|
|
FileReader.readAsFile()
|
|
FileReader.root.getFile()
|
|
FileReader.root.getFile()
|
|
```
|
|
### Injeção de 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)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de injeção de SQL do lado do cliente surgem quando um script incorpora dados controláveis pelo atacante em uma consulta de SQL do lado do cliente de maneira insegura.
|
|
|
|
#### Pontos de Injeção
|
|
```
|
|
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)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de manipulação de armazenamento HTML5 surgem quando um script **armazena dados controlados pelo atacante no armazenamento HTML5** do navegador da web (seja `localStorage` ou `sessionStorage`).\
|
|
Este **comportamento não constitui, em si, uma vulnerabilidade de segurança**. No entanto, se a aplicação posteriormente **ler dados de volta do armazenamento e processá-los de maneira insegura**, um atacante pode ser capaz de alavancar o mecanismo de armazenamento para entregar outros ataques baseados em DOM, como cross-site scripting e injeção de JavaScript.
|
|
|
|
#### Sinks
|
|
```
|
|
sessionStorage.setItem()
|
|
localStorage.setItem()
|
|
```
|
|
### Injeção 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)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de injeção de XPath baseadas em DOM ocorrem quando um script incorpora **dados controláveis pelo atacante em uma consulta XPath**.
|
|
|
|
#### Pontos de vazamento
|
|
```
|
|
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)
|
|
|
|
#### Como
|
|
|
|
As 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**.
|
|
|
|
#### Pontos de Injeção (Sinks)
|
|
```
|
|
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)
|
|
|
|
#### Como
|
|
|
|
As 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.\
|
|
**Exemplo** de manipulação vulnerável de mensagens da web em [https://portswigger.net/web-security/dom-based/controlling-the-web-message-source](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 manipula os dados recebidos de forma insegura.
|
|
|
|
### Manipulação de dados do DOM
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de manipulação de dados do DOM surgem quando um script escreve dados controláveis pelo atacante em um campo dentro do DOM que é usado na interface do usuário visível ou na lógica do lado do cliente. Um atacante pode ser capaz de usar essa vulnerabilidade para construir uma URL que, se visitada por outro usuário, modificará a aparência ou o comportamento da interface do usuário do lado do 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()
|
|
```
|
|
### Negação de Serviço
|
|
|
|
De: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service)
|
|
|
|
#### Como
|
|
|
|
As vulnerabilidades de negação de serviço baseadas em DOM ocorrem quando um script passa **dados controláveis pelo atacante de maneira insegura para uma API problemática da plataforma**, como uma API cuja invocação pode fazer com que o computador do usuário consuma **quantidades excessivas de CPU ou espaço em disco**. Isso pode resultar em efeitos colaterais se o navegador restringir a funcionalidade do site, por exemplo, rejeitando tentativas de armazenar dados em `localStorage` ou matando scripts ocupados.
|
|
|
|
#### Pontos de Injeção (Sinks)
|
|
```
|
|
requestFileSystem()
|
|
RegExp()
|
|
```
|
|
## Dom Clobbering
|
|
|
|
{% content-ref url="dom-clobbering.md" %}
|
|
[dom-clobbering.md](dom-clobbering.md)
|
|
{% endcontent-ref %}
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|