DIVA系列教程 part 5 – 访问控制问题
DIVA第9,10,11关都是访问控制问题
9.ACCESS CONTROL ISSUES – PART 1
- 目标:可以直接点击按钮访问api认证,现在需要尝试从外部访问此api认证
- 提示:当权限保护有问题时,应用组件可以通过其他用户或应用来获取访问。这些组件包括activities,services,content providers等
点击按钮直接来到认证后的界面
我们的目标就是不点击按钮,在不访问此案例情况下从外部得到认证后的消息。
在AndroidManifest.xml中存在此activity的名称,action等的描述信息
以上代码APICredsActiviey是通过 intent-filter来进行保护的,然而 intent-filter不能作为一种保护机制,若如此,组件就会暴露,由此activity存在缺陷并且可以被外部应用所利用。
根据AndroidManifest.xml中APICredsActiviey属性描述,可以使用 adb shell来构造触发此activity
adb shell am start jakhar.aseem.diva/.APICredsActivity
更常用的命令是这个
adb shell am start -n jakhar.aseem.diva/.APICredsActivity -a jakhar.aseem.diva.action.VIEW_CREDS
执行之后发现app中界面自动跳转到认证后界面
10.ACCESS CONTROL ISSUES – PART 2
- 目标:注册Tveeter后就可以访问第三方应用TVEETER api,这个应用需要你在线注册,官网返回一个pin码,用它来注册。现在需要在不知道PIN码情况下从应用外部来访问验证后的信息。这是常见的商业逻辑问题,需要查看源代码
- 提示:权限访问保护不正确时,应用组件可以被其他应用或用户访问,有些组件还会需要额外的输入信息。
当选择第一项 Register Now然后点击按钮,提示需要去官网并根据给予的PIN码来注册。随便输入PIN码是不行的
当选择 Already Registered 选项点击按钮,会返回验证通过后的信息,注意username 是diva2,区别于上一关
我们的目标就是在不知道PIN码时直接访问已注册后的认证信息。
在AndroidManifest.xml中查找到 AccessControl2Activity 和 APICreds2Activity 的activity以及action信息
根据上一关的方法,直接adb shell输入命令
adb shell am start -n jakhar.aseem.diva/.APICreds2Activity -a jakhar.aseem.diva.action.VIEW_CREDS2
然而返回的是注册页面,并不是已注册后的认证页面。
据此猜测可能有一个注册与否的判断,根据某个属性值在加载时确定是否已成功注册,跟软件破解有些类似。
根据提示,需要查看diva的源码,下载地址:https://github.com/payatu/diva-android
在 APICreds2Activity.java 源码中看到 bncheck 这个属性是控制注册与否的判断的,本案例中,bncheck = false 才可以
bncheck赋值引出另一个关键字: R.string.chk_pin
在values/string.xml中查看 chk_pin的内容
在 AccessControl2Activity.java 源码中看到chk_pin赋值
根据定义猜测 chk_pin 判断是否现在注册
如果 chk_pin = true 说明需要现在注册,跳转到注册页面;如果 chk_pin = false 说明不需要注册,或者说已经完成注册,就会跳到认证后的界面
据此我们需要设置 chk_pin = false 来控制页面跳转完成破解
在appie中使用如下命令:
adb shell am start -a jakhar.aseem.diva.action.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity -–ez check_pin false
返回认证后页面
用drozer做测试,也是可以成功执行的
11.ACCESS CONTROL ISSUES – PART 3
- 目标:这是个私有笔记应用,可以创建PIN码登录获取访问。现在在不知道PIN码情况下在应用外部访问内部私有数据
首先创建一个PIN码,随便输入,如1357
创建后多出一项 访问私有笔记,进入后需要输入PIN码
正确验证后来到私有笔记区,可以看到私有数据
首先查看AndroidManifest.xml中关于此案例的描述
发现有个 exported = true 的 provider 注册。content providers 使用URI,通常开头是 content://
使用搜索功能查找关键字: content://
找到 NotesProvider.smali 中重要信息
根据以上smail代码,找到路径
content://jakhar.aseem.diva.provider.notesprovider/notes
根据xml中属性信息,这个content 是exported = true 的,也就意味着可以直接外部访问
输入命令
adb shell content query –uri content://jakhar.aseem.diva.provider.notesprovider/notes
就可以查询到认证后的私有笔记信息