BOOK THIS SPACE FOR AD
ARTICLE ADPara compreender o XSS (Cross-Site Scripting) DOM-Based, é essencial primeiro entender o Document Object Model (DOM). Quando um navegador interpreta uma página HTML, ele deve renderizar os elementos HTML individuais. Esse processo de renderização cria objetos correspondentes a cada elemento para exibição.
Elementos HTML, como a tag <div>, podem conter outros elementos, como <h1>. Durante a análise pelo navegador, o objeto correspondente a <div> é criado e contém o objeto <h1> como um “nó filho”. A estrutura hierárquica formada por esses objetos, que representam os elementos HTML individuais, compõe o DOM.
Os elementos HTML podem ser identificados por diferentes atributos, como id, class, name e outros identificadores, que são refletidos nos objetos do DOM. O navegador gera um DOM a partir do HTML para permitir a manipulação programática da página via JavaScript.
Os desenvolvedores utilizam JavaScript para modificar o DOM, possibilitando tarefas em segundo plano, mudanças na interface do usuário (UI) e outras interações diretamente no navegador do cliente. Embora seja possível fazer alterações dinâmicas no lado do servidor, gerando HTML de forma dinâmica e enviando-o de volta ao usuário, esse processo pode introduzir um atraso significativo na experiência do aplicativo.
Para manipular o DOM, o JavaScript implementa a interface Document, que fornece métodos como getElementById, getElementsByClassName e getElementsByTagName. Os objetos retornados dessas consultas herdam da classe base Element, que contém propriedades como innerHTML, usada para modificar o conteúdo dentro de um elemento HTML. Além disso, a interface Document permite a escrita direta no DOM por meio do método write().
As vulnerabilidades XSS DOM-Based geralmente surgem quando o JavaScript pega dados de uma fonte controlável pelo invasor, como a URL, e os passa para um coletor que oferece suporte à execução dinâmica de código, como eval() ou innerHTML. Isso permite que os invasores executem JavaScript, o que normalmente permite que eles sequestrem as contas de outros usuários.
Para entregar um ataque XSS DOM-Based, é necessário colocar os dados em uma fonte para que eles sejam propagados para um coletor e causem a execução de JavaScript arbitrário. A fonte mais comum para DOM XSS é a URL, que normalmente é acessada com o objeto window.location. Um invasor pode construir um link para enviar uma vítima a uma página vulnerável com uma carga na cadeia de caracteres de consulta e partes de fragmento da URL.
Para testar o XSS DOM em um coletor de HTML, coloque uma cadeia de caracteres alfanumérica aleatória na origem (como location.search) e use as ferramentas de desenvolvedor para inspecionar o HTML e descobrir onde a cadeia de caracteres aparece.
Nas ferramentas de desenvolvedor do Chrome, você pode usar Ctrl+F (ou Command+F no macOS) para pesquisar o DOM para sua string. Para cada local em que sua cadeia de caracteres aparece no DOM, você precisa identificar o contexto e refinar sua entrada para ver como ela é processada.
Testar coletores de execução de JavaScript para XSS baseado em DOM é um pouco mais difícil. Com esses coletores, sua entrada não aparece necessariamente em nenhum lugar dentro do DOM, portanto, você precisa usar o depurador JavaScript para determinar se e como sua entrada é enviada para um coletor.
Diferentes fontes e coletores têm propriedades e comportamentos distintos que podem afetar a capacidade de exploração. Além disso, os scripts do site podem realizar validação ou outro processamento de dados que devem ser considerados ao tentar explorar uma vulnerabilidade.
Um exemplo de coletor é document.write(), que pode ser explorado da seguinte maneira:
document.write('... <script>alert(document.domain)</script> ...');No entanto, em algumas situações, o conteúdo gravado inclui algum contexto circundante que precisa ser considerado.
Outro coletor comum é innerHTML, onde manipuladores de eventos como onload e onerror podem ser usados para execução de código:
element.innerHTML='... <img src=1 onerror=alert(document.domain)> ...';Os aplicativos Web modernos geralmente utilizam bibliotecas como jQuery e AngularJS, que também podem ser fontes e coletores potenciais para DOM XSS.
Se uma biblioteca como jQuery estiver sendo usada, funções como attr() e $() podem ser exploradas para modificar atributos e injetar código malicioso. Um exemplo seria modificar a URL de um link:
$('#backLink').attr("href", (new URLSearchParams(window.location.search)).get('returnUrl'));Se o parâmetro returnUrl contiver código JavaScript malicioso, ele será executado ao clicar no link.
Se um site usa AngularJS, pode ser possível executar JavaScript sem colchetes angulares ou eventos, simplesmente injetando código dentro de chaves duplas ({{}}).
Além das vulnerabilidades puramente baseadas em DOM, algumas podem envolver dados refletidos e armazenados. Um exemplo de DOM XSS reflected ocorre quando o servidor ecoa um parâmetro da URL dentro de um JavaScript, permitindo que um atacante injete código malicioso. Já no DOM XSS Stored, os dados são salvos no servidor e posteriormente refletidos em outra página vulnerável.
Alguns coletores conhecidos incluem:
document.write()document.writeln()document.domainelement.innerHTMLelement.outerHTMLelement.insertAdjacentHTMLelement.oneventPara mitigar esses ataques:
Evite o uso de innerHTML e document.write() sempre que possível.Utilize textContent ou innerText para inserir texto seguro no DOM.Empregue bibliotecas de sanitização, como DOMPurify, para limpar entradas antes de inseri-las no DOM.Valide e escape todas as entradas do usuário antes de processá-las.Utilize o CSP (Content Security Policy) para restringir fontes de scripts não autorizados.Evite eval() e setTimeout() com strings dinâmicas.Prefira APIs seguras, como createElement() e appendChild(), para modificar o DOM de forma segura.