Android WebView RCE漏洞原理
要造成任意代码执行漏洞,至少具备几个条件
- 开启JavaScript开关 setJavaScriptEnabled(true)
- 调用 addJavascriptInterface()
- loadUrl数据源头能进行控制
- 其他
以下是漏洞代码:
public class MainActivity extends AppCompatActivity {
class JsObject {
@JavascriptInterface
public String getToken() { return "{\"token\":\"1234567890abcdefg\"}"; }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = (WebView) findViewById(R.id.myWebview);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient());
webView.addJavascriptInterface(new JsObject(),"VulObj");
webView.loadUrl("https://www.tasfa.cn/poc.htm");
}
}
漏洞利用的点:
- 需要能控制loadUrl中的数据
- 需要有暴露的JS接口
- 需要暴露的JS接口有@JavascriptInterface注解的函数
需要以上三点 才可进行漏洞利用.
在漏洞防御时,常有对Url进行域名检测,以下是绕过姿势总结
indexOf
inputUrl.indexOf(whiteDomain)>0
绕过
http://www.tasfa.cn/poc.htm?whiteDomain.com
取域名后进行校验
- 利用substring
- java.net.URL getHost()
- java.net.URI getHost()
绕过1
URL格式为:
<protocol>://<user>:<password>@<host>:<port>/<url-path>
错误的认为://后面即是域名,从而可绕过:
http://whiteDomain.com@www.tasfa.cn/poc.htm
绕过2
如果使用indexOf,依旧可以通过子域名的形式绕过:
http://www.whiteDomain.com.tasfa.cn/poc.htm
以下URL getHost 为: whiteDomain.com
https://www.tasfa.cn\@www.whiteDomain.com/poc.htm
类似的还有
https://www.tasfa.cn\\.whiteDomain.com
绕过3
JavaScript://www.whiteDomain.com/%0d%0awindow.location.href='http://www.tasfa.cn/poc.htm'
第一行通过//符号来骗过java.net.URI获取到值为www.whiteDomain.com的host,恰好//符号在Javascript的世界里是行注释符号,所以第一行实际并没有执行;然后通过%0d%0a换行,继续执行window.location.href=‘http://www.tasfa.cn/poc.htm’ 请求我们的poc页面。
endsWith
inputDomain.endsWith(WhiteDomain)
注册域名 xxxxxxwhiteDomain
即可绕过
如 www.tasfaWhiteDomain.com
利用URL重定向绕过
https://www.WhiteDomain.com/redirect.php?url=https://www.tasfa.cn/poc.htm