介绍
InsecureShop 是一个 Android 应用程序,旨在故意易受攻击。创建此应用程序的目的是向开发人员和安全专业人员介绍现代 Android 应用程序中存在的漏洞。这也可以作为测试您的 Android 渗透测试技能的平台。
此空间仅旨在指出 InsecureShop 应用程序中实现的漏洞以及使用的易受攻击的代码。此空间不会为您提供 InsecureShop 应用程序中实现的所有漏洞的完整解决方案。
InsecureShop 项目作为SourceZeroCon 2021的一部分发布。
漏洞:
硬编码凭据:凭据硬编码在可用于登录应用程序的某个位置
不充分的 URL 验证:可以通过 Deeplink 在 webview 中加载任意 URL。
弱主机验证检查:可以绕过主机验证检查以在 webview 中加载任意 URL。
任意代码执行:通过第三方包上下文执行任意代码。
访问受保护的组件:该应用采用嵌入式 Intent 并将其传递给 startActivity 等方法。这允许任何第三方应用程序启动任何受保护的组件。
不受保护的数据 URI:通过 loadUrl 方法传递的不受信任的 URI 允许攻击者在 webview 中传递任意 URL。
任意窃取:可以通过 ChooserActivity 从应用程序的本地存储中窃取文件。
使用具有已知漏洞的组件:确定应用程序中使用的易受攻击的组件或库,这些组件或库可以让您将本地文件泄露到远程域。
不安全的广播接收器:导出的活动在 onCreate 方法执行期间注册广播。攻击者可以触发此广播并在“web_url”参数中提供任意 URL。
AWS Cognito 错误配置:错误配置的 AWS Cognito 实例可用于访问 AWS S3 存储桶。
FileProvider 中 FilePaths 的不安全使用:使用广泛的文件共享声明可用于通过内容提供程序访问根目录。
使用隐式意图发送包含敏感数据的广播:使用隐式意图可以允许第三方应用程序窃取凭据。
拦截加载任意 URL 的隐式意图:使用隐式意图可以允许第三方应用程序在 webview 中加载任意 URL。
导出活动中 SetResult 的不安全实现: ResultActivity 中使用的不安全实现可用于访问任意内容提供程序。
不安全的内容提供者:任何第三方应用程序都可以访问内容提供者以窃取用户凭据。
缺少 SSL 证书验证: OnReceived SSL 错误的不安全实现可用于窃听 webview 中加载的所有流量。
启用不安全的 Webview 属性:启用不安全的 Webview 属性,允许第三方应用程序将本地数据泄露到远程域。
不安全的数据存储:该应用程序在本地存储用户凭据而不对其进行加密。
不安全的日志记录:用户凭据在 logcat 中泄露。只有对设备具有物理访问权限的攻击者才能访问此信息。
在项目地址中有直接APK样本提供
项目地址:https://github.com/optiv/InsecureShop
官方文档:https://docs.insecureshopapp.com/
官方地址:https://www.insecureshopapp.com/
漏洞参考:https://erev0s.com/blog/insecureshop-write-up-all-vulnerabilities-explained/
凑个字数,插个广告,其它文章不会插
我们首先检查 AndroidManifest 文件,我们注意到该活动WebViewActivity具有以下内容:
<activity android:name=".WebViewActivity">
<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:host="com.insecureshop"
android:scheme="insecureshop" />
</intent-filter>
</activity>
我们记下此处显示的主机和方案,然后继续查找位于此处的相应类com/insecureshop/WebViewActivity.kt。以下几行立即从 onCreate 函数中弹出:
if (uri.path.equals("/web")) {
data = intent.data?.getQueryParameter("url")
[...]
webview.loadUrl(data)
有一个检查来验证 URI 路径是否等于/web,然后将参数url从 intent 中提取到名为的参数data,稍后将在 webview 中加载该参数。这真的很有趣,因为我们可以构建这样一个 URI 并将任意参数作为 url 传递。我们将使用adb来做到这一点。
更具体地说,我们将使用指定的操作和意图 URI 从 adb 调用活动管理器。下面的命令就是这样做的。
adb shell am start -W -a android.intent.action.VIEW -d "insecureshop://com.insecureshop/web?url=https://erev0s.com"
- am = activity manager
- start = Start an Activity specified by intent
- -W = wait for launch to complete
- -a = intent action
- -d = intent URI
为上面使用的标志添加了一个简短的解释,因为这是我们第一次在本文中看到它们,这将有助于理解 adb 在这种情况下的使用方式。攻击完成后,应用程序加载了我们传递给它的任意 URL。