Webview Attacks
最后更新于
最后更新于
Android 开发的一个关键方面是正确处理 WebViews。本指南重点介绍了用于减轻与 WebView 使用相关风险的关键配置和安全实践。
默认情况下,WebViews 允许文件访问。此功能由 setAllowFileAccess()
方法控制,自 Android API 级别 3(杯子蛋糕 1.5)起可用。拥有 android.permission.READ_EXTERNAL_STORAGE 权限的应用程序可以使用文件 URL 方案(file://path/to/file
)从外部存储器读取文件。
来自文件 URL 的通用访问:此已弃用功能允许来自文件 URL 的跨源请求,由于潜在的 XSS 攻击风险,构成重大安全风险。针对 Android Jelly Bean 及更新版本的应用程序,默认设置为禁用(false
)。
要检查此设置,请使用 getAllowUniversalAccessFromFileURLs()
。
要修改此设置,请使用 setAllowUniversalAccessFromFileURLs(boolean)
。
来自文件 URL 的文件访问:此功能也已弃用,控制对其他文件方案 URL 的内容访问。与通用访问一样,其默认设置为禁用以增强安全性。
使用 getAllowFileAccessFromFileURLs()
进行检查,使用 setAllowFileAccessFromFileURLs(boolean)
进行设置。
为了在仍然访问资产和资源的同时禁用文件系统访问,使用 setAllowFileAccess()
方法。在 Android R 及更高版本中,默认设置为 false
。
使用 getAllowFileAccess()
进行检查。
使用 setAllowFileAccess(boolean)
启用或禁用。
WebViewAssetLoader 类是加载本地文件的现代方法。它使用 http(s) URL 访问本地资产和资源,符合同源策略,从而便于 CORS 管理。
这是在 WebView 中加载任意 URL 的常用函数。
JavaScript:在WebViews中默认禁用,可以通过setJavaScriptEnabled()
启用。建议谨慎操作,因为未经适当保护启用JavaScript可能会引入安全漏洞。
Intent Scheme:WebViews可以处理intent
方案,如果管理不慎可能导致利用漏洞。一个示例漏洞涉及一个暴露的WebView参数"support_url",可能被利用来执行跨站脚本(XSS)攻击。
利用示例使用adb:
Android提供了一项功能,允许WebView中的JavaScript调用本机Android应用功能。这是通过利用addJavascriptInterface
方法实现的,该方法将JavaScript与本机Android功能集成,称为_WebView JavaScript桥接_。建议谨慎使用此方法,因为该方法允许WebView中的所有页面访问已注册的JavaScript接口对象,如果通过这些接口公开敏感信息,则存在安全风险。
针对目标Android版本低于4.2的应用程序,需要极度谨慎,因为存在一种漏洞,允许通过恶意JavaScript利用反射进行远程代码执行。
JavaScript接口可以与本机代码交互,如示例所示,将类方法暴露给JavaScript:
通过向WebView添加接口来启用JavaScript Bridge:
通过 JavaScript 可能会存在潜在的利用漏洞,例如通过 XSS 攻击,从而可以调用暴露的 Java 方法:
为了减少风险,将限制 JavaScript 桥接的使用 仅限于随 APK 一起提供的代码,并防止从远程来源加载 JavaScript。对于较旧的设备,将最低 API 级别设置为 17。
通过执行特定有效负载,可以通过反射实现 RCE 的已记录方法。然而,@JavascriptInterface
注解防止未经授权的方法访问,限制了攻击面。
使用 Chrome 开发者工具 可以进行 远程调试,从而在 WebView 内容中实现交互和任意 JavaScript 执行。
可以通过以下方式为应用程序中的所有 WebView 启用远程调试:
根据应用程序的可调试状态有条件地启用调试:
展示使用XMLHttpRequest泄露任意文件: