Webview 攻击
Reading time: 8 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
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>")
当然,潜在攻击者永远不应该能够 控制 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";
};
- 通过向 WebView 添加接口来启用 JavaScript Bridge:
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)
参考文献
- 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
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。