type
status
date
slug
summary
tags
category
icon
password
 

 

一、漏洞APP分析

1. AndroidManifest.xml分析

notion image
AndroidManifest.xml 中声明了三个组件,两个Activity和一个Receiver ,其中只有MainActivity是导出的
 

2. MainActivity

MainActivity 先是获取intent的数据,然后经过校验后使用webView.loadUrl(data.toString())进行加载,而且设置了setJavaScriptEnabled(true) 这意味着启用了JavaScript 。除此之外设置了setWebViewClient ,并且通过shouldOverrideUrlLoading 拦截请求,在内部校验intent 并且可以进行跳转。因此这里存在攻击点,即可以绕过getAuthority 校验加载恶意html,在html内部使用JavaScript 构造重定向请求,然后跳转到指定的非导出Activity
 

3. TestActivity

TestActivity 则通过getStringExtra("url") 直接拿到一个url并且使用webview进行加载,没有进行任何校验,因此存在攻击点,即通过TestActivity进行恶意网页的加载。

4.FlagReceiver

FlagReceiver 则通过cookieManager 设置了一个cookie值,该值就是flag ,而该cookie值存储在/data/data/com.bytectf.easydroid/app_webview/Cookies中,该组件在环境启动时收到flag从而设置flag,因此攻击目标即为获取该Cookies文件
 

 

二、攻击APP构造

 

1. 构造demo验证可行性

首先编写一个APP用于验证攻击的可行性,设置三个Activity,验证能否绕过url校验并且顺利实现跳转。
绕过方案:http://[email protected]/evil.html 则可以实现对getAuthority().contains("toutiao.com") 的绕过,并且实际访问的是xxx.xxx.xxx.xxx/evil.html, 而访问的evil.html 中可以通过location.href 使app获取到Intent Url
"intent:pwneasydroid#Intent;launchFlags=0x3;package=com.bytectf.pwneasydroid;component=com.bytectf.pwneasydroid/.Third;end"
shouldOverrideUrlLoading 拦截到该url时通过startActivity(Intent.parseUri(url,1)) 跳转到目标Activity。
编写evil.html 使APP跳转到Third
logcat输出验证了绕过方案的可行性并且能够成功跳转至Third
在实际攻击中可以设置S.url,控制被攻击APP 跳转到百度,因为在被攻击的TestActivity中获取了额外的属性url并且进行加载
 

2. 攻击方案

总的来说,首先肯定是绕过校验并且使被攻击APP跳转至TestActivity然后加载不经过任何校验的恶意网页,然后想办法窃取被攻击APP私有目录下的Cookies文件
 
方案一:符号链接延迟跨源攻击,操纵WebView去访问一个攻击APP自己公开出来的网页,然后这个网页执行的内容其实就是延时去读取自身。在延时读取自身的时间窗口内,这个文件悄悄被进行了替换,替换成了软链接,指向受害APP的一个私有文件,最终读取窃取其内容。
notion image
限制:该漏洞在Android7.0及以上修复,而题目环境为Android8.1,因此无法使用该方法进行攻击,但是在搭建的Android6.0环境上成功实施了攻击
方法
作用/风险
默认策略
setAllowFileAccess(true)
设置是否允许 WebView 使用 File 协议访问文件系统
在API29及以下默认设置为 true
setAllowFileAccessFromFileURLs(true)
方法用于设置是否允许在文件方案URL的上下文中的跨源请求访问其他文件URL的内容。该方法在API级别30中已被弃用,并且不安全。相反,应使用androidx.webkit.WebViewAssetLoader以安全方式加载文件内容
在 Android 4.1 后默认禁止 在API30中已被弃用
setAllowUniversalAccessFromFileURLs(true)
用于设置是否允许在文件方案URL的上下文中的跨源请求访问任何其他来源的内容。如果应用程序需要访问文件系统,最好避免使用file://URL。而是使用通过HTTPS加载文件的替代方法,例如androidx.webkit.WebViewAssetLoader
在 Android 4.1 后默认禁止
setJavaScriptEnabled(true)
设置是否允许 WebView 使用 JavaScript
默认不允许
💡
注意:在Android10及以下默认setAllowFileAccess(true) ,而该漏洞不需要setAllowFileAccessFromFileURLssetAllowUniversalAccessFromFileURLs 设置为True即可进行攻击,即绕过了同源检测,但是依旧需要setJavaScriptEnabled设置为True
MainActivity源码
evil.html源码
Android6.0攻击结果
notion image
Android8.1攻击结果
notion image
注意,此处即使开启setAllowFileAccessFromFileURLssetAllowUniversalAccessFromFileURLs也攻击失败,虽然被攻击APP能够渲染Cookies,但是无法向服务器传回数据,因此判定攻击失败
 
 
方案二:污染Cookies窃取数据
在这个方案里,需要先通过访问恶意HTML将恶意js插入Cookies中,然后控制被攻击APP访问Cookies本身,触发恶意代码造成数据泄露
notion image
具体的攻击思路: 首先攻击者APP跳转到被攻击APP的MainActivity,使其访问evil.html 在该恶意html中设置cookies并且延时40s执行intent跳转,设置cookies即设置恶意代码,等待后续被读取渲染时运行恶意代码,即等待cookies写入到被攻击APP目录下的Cookies文件中后跳转到TestActivity ,然后TestActivity 加载url:file:///data/data/com.bytectf.pwneasydroid/files/symlink.html ,这个url将会读取pwneasydroid 数据目录下的一个symlin.html,该html创建于跳转到被攻击MainActivity 至跳转到TestActivity 这段时间,使其指向/data/data/com.bytectf.easydroid/app_webview/Cookies ,然后TestActivitywebview加载时触发到插入到Cookies里的恶意代码,使其读取Cookies本身并且发送到远程,即可成功实现Cookies泄露,flag就在Cookies中
💡
这里需要格外注意权限问题:不仅需要给/data/data/com.bytectf.pwneasydroid/files 及目录下的文件777权限,而且还要给/data/data/com.bytectf.pwneasydroid 这个目录的777权限,否则将会访问失败
MainActivity
evil.html
Android8.1攻击效果
notion image
notion image
 
 

 

三、总结

notion image
💡
虽然题目本身考点不难,但是操作起来很费劲,尤其需要关注Android环境 然后就是目录的权限问题,如果不设置/data/data/packagename 为777,那被攻击APP就无法读取到目录下的恶意html,导致攻击失败

 

四、参考

  1. Docs (feishu.cn)
  1. (72条消息) Android安全检测-WebView File域同源策略绕过漏洞_webview同源策略漏洞_asjhan的博客-CSDN博客
  1. [原创]Android APP漏洞之战(13)——WebView漏洞详解-Android安全-看雪-安全社区|安全招聘|kanxue.com
 
 
ByteCTF2021 MediumDroid复现ByteCTF2021 BabyDroid复现
  • Twikoo