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

156 lines
9.7 KiB
Markdown
Raw Normal View History

# Webview Attacks
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Guía sobre configuraciones y seguridad de WebView
### Visión general de las vulnerabilidades de WebView
2023-06-05 18:33:24 +00:00
Un aspecto crítico del desarrollo de Android implica el manejo correcto de WebViews. Esta guía destaca configuraciones clave y prácticas de seguridad para mitigar los riesgos asociados con el uso de WebView.
![WebView Example](<../../.gitbook/assets/image (1190).png>)
### **Acceso a archivos en WebViews**
2023-06-05 18:33:24 +00:00
Por defecto, los WebViews permiten el acceso a archivos. Esta funcionalidad se controla mediante el método `setAllowFileAccess()`, disponible desde el nivel de API 3 de Android (Cupcake 1.5). Las aplicaciones con el permiso **android.permission.READ\_EXTERNAL\_STORAGE** pueden leer archivos del almacenamiento externo utilizando un esquema de URL de archivo (`file://path/to/file`).
2023-06-05 18:33:24 +00:00
#### **Características obsoletas: Acceso universal y acceso a archivos desde URLs**
2023-06-05 18:33:24 +00:00
* **Acceso universal desde URLs de archivo**: Esta característica obsoleta permitía solicitudes de origen cruzado desde URLs de archivo, lo que representaba un riesgo de seguridad significativo debido a posibles ataques XSS. La configuración predeterminada está deshabilitada (`false`) para aplicaciones que apuntan a Android Jelly Bean y versiones más recientes.
* Para verificar esta configuración, utiliza `getAllowUniversalAccessFromFileURLs()`.
* Para modificar esta configuración, utiliza `setAllowUniversalAccessFromFileURLs(boolean)`.
* **Acceso a archivos desde URLs de archivo**: Esta característica, también obsoleta, controlaba el acceso al contenido desde otras URLs de esquema de archivo. Al igual que el acceso universal, su configuración predeterminada está deshabilitada para mejorar la seguridad.
* Utiliza `getAllowFileAccessFromFileURLs()` para verificar y `setAllowFileAccessFromFileURLs(boolean)` para establecer.
2023-06-05 18:33:24 +00:00
#### **Carga segura de archivos**
2023-06-05 18:33:24 +00:00
Para deshabilitar el acceso al sistema de archivos mientras se accede a activos y recursos, se utiliza el método `setAllowFileAccess()`. Con Android R y versiones posteriores, la configuración predeterminada es `false`.
* Verifica con `getAllowFileAccess()`.
* Habilita o deshabilita con `setAllowFileAccess(boolean)`.
2023-06-05 18:33:24 +00:00
#### **WebViewAssetLoader**
2023-06-05 18:33:24 +00:00
La clase **WebViewAssetLoader** es el enfoque moderno para cargar archivos locales. Utiliza URLs http(s) para acceder a activos y recursos locales, alineándose con la política de mismo origen, facilitando así la gestión de CORS.
### loadUrl
2023-06-05 18:33:24 +00:00
Esta es una función común utilizada para cargar URLs arbitrarias en un webview:
```java
webview.loadUrl("<url here>")
```
Ofc, un atacante potencial nunca debería poder **controlar la URL** que una aplicación va a cargar.
### **Manejo de JavaScript y Esquema de Intent**
2023-06-05 18:33:24 +00:00
* **JavaScript**: Desactivado por defecto en WebViews, se puede habilitar a través de `setJavaScriptEnabled()`. Se recomienda precaución, ya que habilitar JavaScript sin las salvaguardias adecuadas puede introducir vulnerabilidades de seguridad.
* **Esquema de Intent**: Los WebViews pueden manejar el esquema `intent`, lo que puede llevar a exploits si no se gestiona cuidadosamente. Una vulnerabilidad de ejemplo involucró un parámetro de WebView expuesto "support\_url" que podría ser explotado para ejecutar ataques de scripting entre sitios (XSS).
![Vulnerable WebView](<../../.gitbook/assets/image (1191).png>)
2023-06-05 18:33:24 +00:00
Ejemplo de explotación usando adb:
{% code overflow="wrap" %}
```bash
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://example.com/xss.html"
```
{% endcode %}
### Javascript Bridge
2023-06-05 18:33:24 +00:00
Una característica es proporcionada por Android que permite a **JavaScript** en un WebView invocar **funciones nativas de la aplicación Android**. Esto se logra utilizando el método `addJavascriptInterface`, que integra JavaScript con funcionalidades nativas de Android, denominado como un _WebView JavaScript bridge_. Se aconseja precaución ya que este método permite que todas las páginas dentro del WebView accedan al objeto de Interfaz JavaScript registrado, lo que representa un riesgo de seguridad si se expone información sensible a través de estas interfaces.
2023-06-05 18:33:24 +00:00
* **Se requiere extrema precaución** para las aplicaciones que apuntan a versiones de Android anteriores a 4.2 debido a una vulnerabilidad que permite la ejecución remota de código a través de JavaScript malicioso, explotando la reflexión.
#### Implementando un JavaScript Bridge
* **Las interfaces de JavaScript** pueden interactuar con código nativo, como se muestra en los ejemplos donde un método de clase se expone a JavaScript:
2023-06-05 18:33:24 +00:00
```javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
2023-06-05 18:33:24 +00:00
```
* El puente de JavaScript se habilita al agregar una interfaz al WebView:
2023-06-05 18:33:24 +00:00
```javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
```
* La explotación potencial a través de JavaScript, por ejemplo, mediante un ataque XSS, permite la llamada a métodos Java expuestos:
```html
2023-06-05 18:33:24 +00:00
<script>alert(javascriptBridge.getSecret());</script>
```
* Para mitigar riesgos, **restringe el uso del puente JavaScript** al código enviado con el APK y evita cargar JavaScript de fuentes remotas. Para dispositivos más antiguos, establece el nivel mínimo de API en 17.
2023-06-05 18:33:24 +00:00
### Ejecución Remota de Código Basada en Reflexión (RCE)
2023-06-05 18:33:24 +00:00
* Un método documentado permite lograr RCE a través de reflexión ejecutando una carga útil específica. Sin embargo, la anotación `@JavascriptInterface` previene el acceso no autorizado a métodos, limitando la superficie de ataque.
2023-06-05 18:33:24 +00:00
### Depuración Remota
2023-06-05 18:33:24 +00:00
* **La depuración remota** es posible con **Chrome Developer Tools**, lo que permite la interacción y la ejecución arbitraria de JavaScript dentro del contenido de WebView.
2023-06-05 18:33:24 +00:00
#### Habilitando la Depuración Remota
2023-06-05 18:33:24 +00:00
* La depuración remota se puede habilitar para todos los WebViews dentro de una aplicación mediante:
2023-06-05 18:33:24 +00:00
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
2023-06-05 18:33:24 +00:00
}
```
* Para habilitar la depuración condicionalmente según el estado de depuración de la aplicación:
2023-06-05 18:33:24 +00:00
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
2023-06-05 18:33:24 +00:00
}
```
## Exfiltrar archivos arbitrarios
* Demuestra la exfiltración de archivos arbitrarios utilizando un XMLHttpRequest:
2023-06-05 18:33:24 +00:00
```javascript
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
2023-06-05 18:33:24 +00:00
}
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);
```
## Referencias
* [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)
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
<summary>Apoya a HackTricks</summary>
2023-06-05 18:33:24 +00:00
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}