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)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao š¬ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter š¦ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĆ³rios do github.
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:
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 | InjeĆ§Ć£o de Javascript | ManipulaĆ§Ć£o de dados DOM | 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 | 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ƧƵes Ajax | 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 links | someDOMElement.innerHTML | jQuery.parseHTML() |
jQuery.globalEval() | someDOMElement.href | someDOMElement.outerHTML | $.parseHTML() |
$.globalEval() | someDOMElement.src | someDOMElement.insertAdjacentHTML | InjeĆ§Ć£o de JSON do lado do cliente |
``ManipulaĆ§Ć£o de armazenamento HTML5 | someDOMElement.action | someDOMElement.onevent | JSON.parse() |
sessionStorage.setItem() | InjeĆ§Ć£o de XPath | 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 Cookies |
requestFileSystem() | ``ManipulaĆ§Ć£o de domĆnio do documento | document.implementation.createHTMLDocument() | document.cookie |
RegExp() | document.domain | history.pushState() | Envenenamento de URL do WebSocket |
InjeĆ§Ć£o SQL do lado do cliente | ManipulaĆ§Ć£o de mensagens da Web | 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.
Ferramentas para encontrĆ”-los
- 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
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:
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:
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:
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:
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.
ManipulaĆ§Ć£o de links
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:
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:
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:
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:
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:
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:
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:
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:
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:
requestFileSystem()
RegExp()
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)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao š¬ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter š¦ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĆ³rios do github.