从零开始学Android应用安全测试(Part3)
操作方法
- 01
在本节中内容中,我们将看看如何对安卓应用程序中的组件进行攻击测试。阅读前两节 在此之前,你的理解安卓应用程序中的组件是何方神圣。安卓组件是构成安卓应用的基础,这些组件都可以在安卓manifest.xml文件中去配置。这里我们简单的介绍其中四种相对来说较为重要的组件。 组件描述 Activities控制用户UI,处理用户在智能手机屏幕上的交互 Services无须可视化界面,提供后台长时运行的功能 Broadcast Receivers处理安卓应用程序与安卓系统之间的通信 Content Providers处理数据与数据库之间的管理问题 Activities 一个Activity组件代表一个简单的用户界面。举例子说,Email应用可能有一个Activity组件用来显示新邮件列表,一个Activity组件用来写邮件,再有一个Activity组件用来读取邮件。一个Activity是一个界面,多个Activity表示多个界面。 一个Activity作为Activity class的子类执行,如下 public class MainActivity extends Activity { } Services Services是一个提供后台长时间运行的组件。比如当你在听音乐的时候你依旧可以正常使用其他应用,再或者你也能够打开网络连接上网,而不影响用户的交互行为。 一个Services作为Services Class的子类执行,如下 public class MyService extends Service { } Broadcast Receivers 广播只是回应来自系统或者其他应用的广播消息。比如,应用程序可以启动广播告知其他应用设备中已经存在的数据,以及可以使用的数据等等。 一个Broadcast Receivers作为Broadcast Receivers Class的子类执行,如下 public class MyReceiver extends BroadcastReceiver { } Content Providers Content Providers组件存储和取得数据,以及让它对所有应用程序可见。Android整理了一大堆content provider给公共数据类型(音频、视频、图像、联系人信息等等)。 一个Content Providers作为Content Providers Class的子类执行。必须使用一个标准的API,这样其他应用程序才能执行协议 public class MyContentProvider extends ContentProvider { } 附加组件 以下这些组件可能我们也会用到,这里暂且简单的介绍一下。 组件介绍 FragmentsFragment表现Activity中用户界面的一个行为或者是一部分。 Views是最基本的UI类,基本上所有的高级UI组件都是集成子View类的实现。 LayoutsLayout 是一个可横向和纵向排列布局的一个容器,布局组件。 IntentsIntent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性 Resources外部元素,比如字符串,常量,图片等等。 Manifest应用配置文件 Android:exported 组件的中最重要的属性就是android:exported,以下文字来自于安卓官方文档 这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。 它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。 这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。 因此,如果一个Activity属性为exported,那么他就可以调用外部应用程序。为了测试InsecureBank应用中的Activity,我们首先打开Genymotion模拟器中的InsecureBank应用并启动后端服务。 一旦我们启动这个应用,我们就可以看到这个登录界面。如果登录成功过后activity的属性为exported,我们就可以直接调用activity 接着我们来看看manifest文件,或许我们能够找到相关的activity。如下图所示,首先使用apktool解压应用 下面就是manifest文件的样子咯。正如你看到的,有一个名为.PostLogin的Activity组件属性为exported 我们可以在模拟器中使用activity manager工具直接调用这个activity,我们来看看吧 使用am tool启动一个activity,命令如下 adb shell am start -n com.package.name/com.package.name.ActivityName 在这个例子中,我们可以在manifest文件中看到这个包的名字为com.android.insecurebankv2 所以,我们使用如下所示命令来调用PostLogin activity 在这个应用中,你可以看到你已经成功绕过了登录页面 你也可以使用drozer调用Activity或者其他组件,下一节我们来介绍drozer。 这里有几个方法可以防止这类漏洞。 首先,除非真的有必要,请将android:exported 属性设置为FALSE 其次,如果应用需要调用特定的外部应用程序,你可以为activity组件增加自定义权限,仅仅允许应用程序请求权限调用activity组件。 在下一节开始之前,请大家预习一下安卓manifest文件,以及安卓应用程序中的不同组件。