hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md
2023-06-06 18:56:34 +00:00

25 KiB

XSS DOM

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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 {% 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.

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 🎥