type
status
date
slug
summary
tags
category
icon
password
一、漏洞APP分析
1. AndroidManifest.xml
AndroidManifest
主要声明了一个MainActivity
,一个FlagReceiver
,剩下的无需分析 2. MainActivity
MainActivity
获取到intent的data
后,使用String secUrl = "https://bytectf-1303079954.cos.ap-nanjing.myqcloud.com/jump.html?url=" + uri
进行跳转,这里原本环境要求是只能接受https
协议的url
,因此是输入一个https链接,然后jump.html进行跳转。另外,题目设计出现问题,前后两次进行了
webView.setWebViewClient(new WebViewClient()
的操作,导致前一个校验无效,因此,其实完全可以不管第一个校验,但是在这里复现将第一个校验也考虑在内。- 第一个无效校验就是校验
https
和Host
的后缀,对于Host校验,ByteCTF2021 HardDroid
中提到可以通过HierarchicalUri
绕过校验,但是这里不行,因为题目的环境是直接让输入一个URL,而非允许安装攻击APP,所以这里无法直接用字符串的方式绕过,但是给出提示可以用腾讯云的对象存储,其域名是以.myqcloud.com
结尾的。
- 第二个则是判断路径第一节是否为
/local_cache/
,如果是就到后面读取/data/data/com.bytectf.silverdroid/cache/
下的文件并且作为响应,实现离线加载,这里参照ByteCTF2021 ByteDroid1
的复现,就是通过路径穿越读取其他的文件,这里读取/data/data/com.bytectf.silverdroid/files/flag
文件并回传
3. jmup.html
jmup.html
是APP中用于跳转的url,其源码校验了myqcloud
,也就是说跳转的链接不能包含myqcloud
,如果假设第一个校验有效这里就必须使用.myqcloud.com
结尾的host,所以使用特殊字符绕过。官方给出的解决方案是使用
Unicode等价性
,可以在这个网站中找到各式各样的Unicode等价性字符:https://www.compart.com/en/unicode/html
比如我们这里poc就用的https://www.compart.com/en/unicode/U+1F132
即在webview加载url的时候:c=🄲
,同时还会在url把特殊的🄲统一化到普通的c。二、攻击APP构造
1. 攻击方案
首先在腾讯云开一个免费额度的对象存储服务,把恶意html放里面,然后拿到链接,然后替换一下特殊字符,用
jump.html
跳转。而evil.html
的内容就是通过构造/local_cache/..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F%2Fdata%2Fdata%2Fcom.bytectf.silverdroid%2Ffiles%2Fflag
这样的路径造成路径穿越,然后将内容发送到https://webhook.site
,这里必须要进行编码。这里需要明确一点。在Android5.0之前,系统默认是采用的
MIXED_CONTENT_ALWAYS_ALLOW
模式,即总是允许WebView同时加载Https和Http;而从Android5.0开始,默认用MIXED_CONTENT_NEVER_ALLOW
模式,即总是不允许WebView同时加载Https和Http
,也就是说对于本题而言通过webview
加载都要使用https
,否则无法正常访问,所以为了方便才使用https://webhook.site
的服务2. 攻击结果
成功拿到flag回传
三、总结
- 考察host校验的绕过
- 考察离线加载的路径穿越漏洞
参考
- 作者:LLeaves
- 链接:https://lleavesg.top//article/ByteCTF-2022-SilverDroid
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章