DOM XSS

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Vulnerabilidades DOM

Vulnerabilidades DOM ocorrem quando dados de fontes controladas pelo atacante (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 a execução de scripts.

O risco surge quando os dados fluem de uma fonte para um sink sem validação ou saneamento adequados, permitindo ataques como XSS.

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

Fontes comuns:

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

Principais Vulnerabilidades:

jQuery

location

eval()

scriptElement.src

add()

location.host

Constructor de Function()

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

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

FileReader.readAsFile()

someDOMElement.backgroundImage

constructor()

XMLHttpRequest.setRequestHeader()

FileReader.root.getFile()

someDOMElement.cssText

init()

XMLHttpRequest.open()

FileReader.root.getFile()

someDOMElement.codebase

index()

XMLHttpRequest.send()

someDOMElement.innerHTML

jQuery.parseHTML()

jQuery.globalEval()

someDOMElement.href

someDOMElement.outerHTML

$.parseHTML()

$.globalEval()

someDOMElement.src

someDOMElement.insertAdjacentHTML

someDOMElement.action

someDOMElement.onevent

JSON.parse()

sessionStorage.setItem()

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

requestFileSystem()

document.implementation.createHTMLDocument()

document.cookie

RegExp()

document.domain

history.pushState()

history.replaceState()

WebSocket

executeSql()

postMessage()

``

``

O sink innerHTML não aceita elementos script em nenhum navegador moderno, nem os 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 analisar o código JS, verificar 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

Exemplos

Redirecionamento Aberto

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

As 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 a execução de código arbitrário, como javascript:alert(1), é possível se você tiver controle sobre o início da URL onde ocorre o redirecionamento.

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

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 comportamentos inesperados na 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 das sessões do usuário. O principal sink associado a essa vulnerabilidade é:

Sinks:

document.cookie

Injeção de JavaScript

De: https://portswigger.net/web-security/dom-based/javascript-injection

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:

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

As 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 fundamental na aplicação da política de mesma origem pelos navegadores. Quando duas páginas de origens diferentes definem seus document.domain com o mesmo valor, elas podem interagir sem restrições. Embora os navegadores imponham certos limites aos valores atribuíveis a document.domain, impedindo a atribuição de valores completamente não relacionados à origem da página real, existem exceções. Normalmente, os navegadores permitem o uso de domínios filhos ou pai.

Sinks:

document.domain

Envenenamento de URL de WebSocket

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

O envenenamento de URL de WebSocket ocorre quando um script utiliza dados controláveis como URL de destino para uma conexão WebSocket.

Sinks:

O construtor WebSocket pode levar a vulnerabilidades de envenenamento de URL de WebSocket.

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

As vulnerabilidades de manipulação de link baseadas em DOM surgem quando um script escreve dados controlados 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:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulação de solicitação Ajax

De: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

As vulnerabilidades de manipulação de solicitação Ajax surgem quando um script escreve dados controláveis pelo atacante em uma solicitação Ajax 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

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

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

As vulnerabilidades de injeção de SQL do lado do cliente ocorrem quando um script incorpora dados controláveis pelo atacante em uma consulta de SQL do lado do cliente de forma insegura.

Sinks:

executeSql()

Manipulação de armazenamento HTML5

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

As vulnerabilidades de manipulação de armazenamento HTML5 surgem quando um script armazena dados controláveis pelo atacante no armazenamento HTML5 do navegador 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 realizar outros ataques baseados em DOM, como scripts entre sites 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

As vulnerabilidades de injeção de XPath baseadas em DOM ocorrem quando um script incorpora dados controláveis pelo atacante em uma consulta XPath.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Injeção de JSON do lado do cliente

De: https://portswigger.net/web-security/dom-based/client-side-json-injection

As vulnerabilidades de injeção de JSON baseadas em DOM ocorrem quando um script incorpora dados controlados pelo atacante em uma string que é analisada como uma estrutura de dados JSON e depois processada pela aplicação.

Sinks:

JSON.parse()
jQuery.parseJSON()
$.parseJSON()

Manipulação de mensagens da web

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

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. Um exemplo de manipulação de mensagens da web vulnerável pode ser encontrado na Academia de Segurança na 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 manipula os dados recebidos de forma insegura.

Manipulação de dados do DOM

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

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 é utilizado na interface do usuário visível ou na lógica do lado do cliente. Essa vulnerabilidade pode ser explorada por um atacante para construir um URL que, se visitado por outro usuário, pode alterar a aparência ou 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

As 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 de plataforma problemática. 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. Tais vulnerabilidades podem ter efeitos colaterais significativos, como o navegador restringindo a funcionalidade do site ao rejeitar tentativas de armazenar dados no localStorage ou encerrar scripts ocupados.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

pageDom Clobbering
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Last updated