25 KiB
XSS DOM
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 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!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.
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 stringdocument.referrer
), os cookies do usuário (expostos pela stringdocument.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 {% endhint %}
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ção 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 Link | 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 Cookie |
requestFileSystem() |
``Manipulação de Domínio de Documento | document.implementation.createHTMLDocument() |
document.cookie |
RegExp() |
document.domain |
history.pushState() |
Envenenamento de URL WebSocket |
Injeção de SQL do lado do cliente | Manipulação de Mensagem Web | 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
Exemplos
Redirecionamento Aberto
De: 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
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 (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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 {% endcontent-ref %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 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!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.