DOM XSS

Reading time: 11 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

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.

note

VocĆŖ pode encontrar uma lista mais atualizada de fontes e sinks em https://github.com/wisec/domxsswiki/wiki

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 AbertoInjeção de JavascriptManipulação de dados DOMjQuery
locationeval()scriptElement.srcadd()
location.hostFunction() constructorscriptElement.textafter()
location.hostnamesetTimeout()scriptElement.textContentappend()
location.hrefsetInterval()scriptElement.innerTextanimate()
location.pathnamesetImmediate()someDOMElement.setAttribute()insertAfter()
location.searchexecCommand()someDOMElement.searchinsertBefore()
location.protocolexecScript()someDOMElement.textbefore()
location.assign()msSetImmediate()someDOMElement.textContenthtml()
location.replace()range.createContextualFragment()someDOMElement.innerTextprepend()
open()crypto.generateCRMFRequest()someDOMElement.outerTextreplaceAll()
domElem.srcdoc``Manipulação de caminho de arquivo localsomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Manipulação de requisições AjaxFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Manipulação de linkssomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLInjeção de JSON do lado do cliente
``Manipulação de armazenamento HTML5someDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()Injeção de XPathdocument.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 Cookies
requestFileSystem()``Manipulação de domínio do documentodocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()Envenenamento de URL do WebSocket
Injeção SQL do lado do clienteManipulação de mensagens da Webhistory.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.

Ferramentas para encontrĆ”-los

Exemplos

Redirecionamento Aberto

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

Vulnerabilidades de redirecionamento aberto no DOM ocorrem quando um script escreve 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

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

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

De: 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 ou pais.

Sinks:

javascript
document.domain

Envenenamento de URL do WebSocket

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

O envenenamento de URL do WebSocket 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 envenenamento de URL do WebSocket.

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

Vulnerabilidades de manipulação de links 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

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

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

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

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 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

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

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

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.

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 do DOM

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

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 é 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

De: 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

Dom Clobbering

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks