跳转至

Webview loadurl injection

WebView loadurl 注入

描述

Webview.loadurl 会将给定的 URL 加载到 WebView 会话中。WebView 的 URL 接受不同的协议和路径,这可能导致加载不安全的内容、执行网络钓鱼攻击,或在某些情况下被用来利用远程代码执行(RCE)漏洞。

可以通过多个设置来控制 WebView 会话的功能,例如使用 Websettings 类启用 JavaScript 或本地文件访问。

攻击者可以通过构造恶意的 HTML 或 JavaScript 来利用此漏洞。网络钓鱼攻击可以伪装成虚假的登录表单,以窃取用户的凭据。

以下是一个接受来自 Intent 的不可信 URL 的易受攻击的 Java 代码示例:

public class VulnerableBrowserActivity extends Activity {
      @override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create a new wevbiew session.
        WebView webView = (WebView) findViewById(R.id.webview);

        // Enable javascript.
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);

        // Accept url from untrusted intent.
        String url = getIntent().getStringExtra("URL");
        webView.loadUrl(url);
      }
    }

建议

所有不可信的 URL 必须进行适当的输入验证,以确保只能访问受信任的内容。例如,如果应用程序正在加载本地资产,则必须将加载的 URL 列表加入白名单。

此外,必须对 Webview 的设置进行加固,移除所有不必要的设置,例如 JavaScript 或文件访问。

public class WhitelistBrowserActivity extends Activity {
  private static WHITELISTED_URLS = ImmutableList.of(
    "url1",
    "url2");

  @override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    WebView webView = (WebView) findViewById(R.id.webview);

    String url = getIntent().getStringExtra("url");
    if (!WHITELISTED_URLS.contains(url)) {  /* Note: "https".startsWith("http") == true */
        url = "about:blank";
    }

    webView.loadUrl(url);
  }
}

链接

标准

  • OWASP_MASVS_L1:
    • MSTG_PLATFORM_7
    • MSTG_PLATFORM_2
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_7
    • MSTG_PLATFORM_2
  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • OWASP_MASVS_v2_1:
    • MASVS_CODE_4
    • MASVS_PLATFORM_2
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5