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

154 lines
9.9 KiB
Markdown
Raw Normal View History

# Attaques Webview
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert de l'équipe rouge AWS de HackTricks)</strong></a><strong>!</strong></summary>
Autres façons de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
2022-04-28 16:01:33 +00:00
## Guide sur les configurations et la sécurité de WebView
2021-05-29 13:27:23 +00:00
### Aperçu des vulnérabilités de WebView
2021-05-29 16:57:06 +00:00
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.
2021-05-29 13:27:23 +00:00
![Exemple de WebView](<../../.gitbook/assets/image (718).png>)
2021-05-29 13:27:23 +00:00
### **Accès aux fichiers dans les WebViews**
2021-05-29 13:27:23 +00:00
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`).
2021-05-29 13:27:23 +00:00
#### **Fonctionnalités obsolètes : Accès universel et accès aux fichiers à partir d'URL**
2021-05-29 13:27:23 +00:00
* **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**
2021-05-29 17:00:27 +00:00
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)`.
2021-05-29 17:00:27 +00:00
#### **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 :
```java
webview.loadUrl("<url here>")
```
Bien sûr, un attaquant potentiel ne devrait jamais pouvoir **contrôler l'URL** qu'une application va charger.
2021-05-29 16:28:54 +00:00
### **JavaScript et Gestion des Intent Scheme**
2021-05-29 16:28:54 +00:00
* **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](<../../.gitbook/assets/image (719).png>)
Exemple d'exploitation en utilisant adb:
{% code overflow="wrap" %}
```bash
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://example.com/xss.html"
```
{% endcode %}
2021-05-29 16:28:54 +00:00
### 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:
2021-05-29 16:28:54 +00:00
```javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
2021-05-29 16:28:54 +00:00
```
* JavaScript Bridge est activé en ajoutant une interface à la WebView :
2021-05-29 16:28:54 +00:00
```javascript
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 :
```html
2021-05-29 16:28:54 +00:00
<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.
2021-05-29 16:28:54 +00:00
### Exécution de code à distance basée sur la réflexion (RCE)
2021-05-29 16:28:54 +00:00
* 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.
2021-05-29 16:28:54 +00:00
### 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 :
```java
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 :
```java
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 :
```javascript
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
2021-05-29 16:57:06 +00:00
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);
```
## Références
* [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
* [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
* [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
* [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
* [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Autres façons de soutenir HackTricks:
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>