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);
}
}
链接
- DRD02-J. Do not allow WebView to access sensitive local resource through file scheme
- Webview loadurl (Android documentation)
- Websettings (Android documentation)
标准
- 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