8.4 KiB
WebView 攻击
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版本的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFTs
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @carlospolopm** 上关注我们**。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
WebView 配置和安全指南
WebView 漏洞概述
Android 开发的一个关键方面是正确处理 WebViews。本指南重点介绍了用于减轻与 WebView 使用相关风险的关键配置和安全实践。
WebViews 中的文件访问
默认情况下,WebViews 允许文件访问。此功能由 setAllowFileAccess()
方法控制,自 Android API 级别 3(杯子蛋糕 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的利用示例:
{% code overflow="wrap" %}
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"
{% endcode %}
JavaScript桥接
Android提供了一个功能,允许在WebView中启用JavaScript来调用本机Android应用程序功能。这是通过利用addJavascriptInterface
方法实现的,该方法将JavaScript与本机Android功能集成在一起,称为_WebView JavaScript桥接_。建议谨慎使用此方法,因为该方法允许WebView中的所有页面访问已注册的JavaScript接口对象,如果通过这些接口公开敏感信息,则存在安全风险。
- 针对Android版本低于4.2的应用程序需要极度谨慎,因为存在一个漏洞,允许通过恶意JavaScript利用反射进行远程代码执行。
实现JavaScript桥接
- 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);
}
- 根据应用程序的 debuggable 状态有条件地启用调试:
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
从零开始学习AWS黑客技术 htARTE(HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您想看到您的公司在HackTricks中做广告或下载PDF格式的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 探索PEASS Family,我们的独家NFTs收藏品
- 加入 💬 Discord群 或 电报群 或在Twitter 🐦 @carlospolopm上关注我们。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享您的黑客技巧。