Vulnerability-wiki

WebView 注入漏洞(WebView JavaScript Injection Vulnerability)

1. 漏洞概述

WebView 注入漏洞 是指移动应用在使用 WebView 加载网页时,没有正确限制 JavaScript 执行权限或安全配置不当,导致攻击者可以在 WebView 中注入恶意 JavaScript 代码,从而执行任意操作,包括调用本地接口、窃取数据等。

该漏洞常见于:


2. 漏洞成因

  1. 未禁用不必要的 JavaScript
    • 默认开启 setJavaScriptEnabled(true),但未做安全域名限制。
  2. 不安全的本地接口暴露
    • 通过 addJavascriptInterface() 暴露本地对象,且接口方法无访问控制。
  3. 加载不可信内容
    • WebView 可以加载任意 URL(外部输入),缺乏白名单校验。
  4. 调试功能未关闭
    • 开发阶段开启 setWebContentsDebuggingEnabled(true),上线时未关闭,允许调试注入。
  5. 混合协议与跨域问题
    • 使用 file://http:// 混合加载,容易被中间人攻击替换内容。

3. 攻击原理

攻击者通过注入恶意 JavaScript 脚本(XSS 或替换资源),在 WebView 内执行高权限操作。
如果应用暴露了 addJavascriptInterface(),攻击者可直接调用 Java 层代码,从而:

示例攻击流程:

  1. 攻击者控制网页内容(钓鱼页面、劫持流量、恶意广告)。
  2. 在页面中注入 JS 代码。
  3. WebView 执行 JS → 调用暴露的本地接口 → 访问敏感功能。

4. 常见攻击方式

攻击方式 描述 影响
恶意网页加载 诱导 WebView 加载攻击者控制的 URL 执行任意 JS
中间人劫持 未使用 HTTPS 或证书校验,流量被篡改 注入恶意脚本
本地文件加载漏洞 使用 file:// 加载文件且开启 JS 读取本地敏感文件
接口调用攻击 利用 addJavascriptInterface() 调用本地代码 直接访问敏感 API
跨域访问 利用 CORS/同源策略缺陷访问敏感数据 窃取用户信息

5. 危害


6. 典型案例

  1. 金融 App WebView 漏洞
    • 攻击者通过劫持广告 SDK 加载的网页,注入 JS 调用本地支付接口,发起未授权转账。
  2. 电商 App H5 页面被注入
    • 利用中间人攻击替换加载的 HTML 文件,获取用户的登录 Token。
  3. 游戏混合 App 被远程执行代码
    • WebView 开启 JS 调用接口,攻击者直接控制游戏行为。

7. 防御措施

  1. 限制 JavaScript 使用
    • 仅在必要时开启 setJavaScriptEnabled(true)
    • 对加载的网页内容来源进行严格白名单校验。
  2. 安全暴露本地接口
    • 避免随意使用 addJavascriptInterface()
    • 如果必须使用,限定调用域名 + 权限校验。
  3. 启用安全加载策略
    • 强制使用 HTTPS,开启证书校验(Pinning)。
    • 禁止混合内容加载(setMixedContentMode())。
  4. 关闭调试功能
    • 发布版本禁用 setWebContentsDebuggingEnabled()
  5. 防止本地文件访问漏洞
    • 禁用 file:// 协议加载敏感目录。
    • 关闭跨域访问本地文件(setAllowFileAccessFromFileURLs(false))。
  6. 内容安全策略(CSP)
    • 限制 JS 脚本来源,防止外部注入。

8. 检测方法


9. 总结

WebView 注入漏洞的本质是不安全的网页内容与本地代码交互问题。
防御要点是: