WebView 注入漏洞(WebView JavaScript Injection Vulnerability)
1. 漏洞概述
WebView 注入漏洞 是指移动应用在使用 WebView 加载网页时,没有正确限制 JavaScript 执行权限或安全配置不当,导致攻击者可以在 WebView 中注入恶意 JavaScript 代码,从而执行任意操作,包括调用本地接口、窃取数据等。
该漏洞常见于:
- 混合开发 App(H5 + Native 混合架构)
- 内嵌网页的移动应用
- 未做安全配置的 WebView 调试页面
2. 漏洞成因
- 未禁用不必要的 JavaScript
- 默认开启
setJavaScriptEnabled(true),但未做安全域名限制。
- 不安全的本地接口暴露
- 通过
addJavascriptInterface() 暴露本地对象,且接口方法无访问控制。
- 加载不可信内容
- WebView 可以加载任意 URL(外部输入),缺乏白名单校验。
- 调试功能未关闭
- 开发阶段开启
setWebContentsDebuggingEnabled(true),上线时未关闭,允许调试注入。
- 混合协议与跨域问题
- 使用
file://、http:// 混合加载,容易被中间人攻击替换内容。
3. 攻击原理
攻击者通过注入恶意 JavaScript 脚本(XSS 或替换资源),在 WebView 内执行高权限操作。
如果应用暴露了 addJavascriptInterface(),攻击者可直接调用 Java 层代码,从而:
- 读取本地文件
- 发起任意 HTTP 请求
- 调用敏感系统 API
- 控制应用逻辑
示例攻击流程:
- 攻击者控制网页内容(钓鱼页面、劫持流量、恶意广告)。
- 在页面中注入 JS 代码。
- WebView 执行 JS → 调用暴露的本地接口 → 访问敏感功能。
4. 常见攻击方式
| 攻击方式 |
描述 |
影响 |
| 恶意网页加载 |
诱导 WebView 加载攻击者控制的 URL |
执行任意 JS |
| 中间人劫持 |
未使用 HTTPS 或证书校验,流量被篡改 |
注入恶意脚本 |
| 本地文件加载漏洞 |
使用 file:// 加载文件且开启 JS |
读取本地敏感文件 |
| 接口调用攻击 |
利用 addJavascriptInterface() 调用本地代码 |
直接访问敏感 API |
| 跨域访问 |
利用 CORS/同源策略缺陷访问敏感数据 |
窃取用户信息 |
5. 危害
- 窃取敏感信息(Cookies、Token、本地存储数据)
- 直接调用本地敏感 API(短信、联系人、文件系统)
- 执行任意操作(发交易请求、修改用户数据)
- 绕过应用安全策略(直接触发隐藏功能)
- 持久化攻击(注入的 JS 可长期驻留在 WebView 缓存中)
6. 典型案例
- 金融 App WebView 漏洞
- 攻击者通过劫持广告 SDK 加载的网页,注入 JS 调用本地支付接口,发起未授权转账。
- 电商 App H5 页面被注入
- 利用中间人攻击替换加载的 HTML 文件,获取用户的登录 Token。
- 游戏混合 App 被远程执行代码
- WebView 开启 JS 调用接口,攻击者直接控制游戏行为。
7. 防御措施
- 限制 JavaScript 使用
- 仅在必要时开启
setJavaScriptEnabled(true)。
- 对加载的网页内容来源进行严格白名单校验。
- 安全暴露本地接口
- 避免随意使用
addJavascriptInterface()。
- 如果必须使用,限定调用域名 + 权限校验。
- 启用安全加载策略
- 强制使用 HTTPS,开启证书校验(Pinning)。
- 禁止混合内容加载(
setMixedContentMode())。
- 关闭调试功能
- 发布版本禁用
setWebContentsDebuggingEnabled()。
- 防止本地文件访问漏洞
- 禁用
file:// 协议加载敏感目录。
- 关闭跨域访问本地文件(
setAllowFileAccessFromFileURLs(false))。
- 内容安全策略(CSP)
8. 检测方法
- 静态分析
- 搜索
setJavaScriptEnabled(true)、addJavascriptInterface() 等调用位置。
- 检查是否缺乏白名单域名校验。
- 动态测试
- 使用 Burp Suite/mitmproxy 劫持流量注入 JS。
- 测试调用本地接口执行敏感操作。
9. 总结
WebView 注入漏洞的本质是不安全的网页内容与本地代码交互问题。
防御要点是:
- 限制网页内容来源
- 限制 JS 功能
- 安全暴露接口
- 严格 HTTPS 与调试关闭
这样才能降低被恶意 JS 注入并调用本地敏感 API 的风险。