zoukankan      html  css  js  c++  java
  • DIVA闯关-APP测试

    DIVA闯关

    DIVA简介:

    DIVA(该死的不安全和易受攻击的应用程序)是故意设计的存在很多漏洞的Android app。
    源代码链接:https://github.com/payatu/diva-android
    apk文件链接:http://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz

    闯关工具:

    Java JDK 1.8

    Android SDK Tools

    夜神模拟器

    Apktool

    dex2jarjd-gui

    AXMLPrinter2.jar

    环境部署:

    1. 将adb通过USB与夜神模拟器进行通信。
      要在通过USB连接的设备上使用adb,必须在设备的系统设置中启用USB调试。在搭载 Android 4.2 及更高版本的设备上,“开发者选项”屏幕默认情况下处于隐藏状态。打开夜神模拟器,点击设置->关于平板电脑,可以看到Android 版本为7.1.2,点击版本号7次,即可激活开发者模式,返回上一屏幕,开发者选项->USB调试即打开USB调试功能。

      ​ 现在可以将adb连接模拟器。

      ​ 从Nox/bin/目录进入命令行,输入连接命令,并验证设备是否已连接。

      输入
      adb connect 127.0.0.1:62001
      或
      adb connect 127.0.0.1:52001
      即可以连接到adb
      查看连接情况输入命令 
      adb devices
      

      返回以下内容说明成功。

      图片1

      ​ 扩展:Android 11 及更高版本支持使用 adb从工作站以无线方式部署和调试应用。例如,可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题。
      详情:https://developer.android.google.cn/studio/command-line/adb

    2. 将靶场拖进模拟器,打开靶场。

    开始闯关:

    第一关 不安全的日志输出

    产生原因:由于app代码中将敏感信息(如凭据,会话ID,财务详细信息等)通过log.e输出,所以在app的表单中输入的内容,可以在相关的日志中输出。

    1. 提交数据后,输入命令adb logcat查看日志

      图片2

      也可以进入交互式shell,输入ps | grep -i diva先找到diva的pid值(2732),再通过logcat | grep [pid]获取日志信息。

      图片5

      图片4

    2. 可以通过反编译在logActivity.class中看到代码中使用了log.e输出。

      image-20200811144945936

    第二关 硬编码—第一部分

    硬编码

    • 某些需要比较字符串的值为硬编码,如:激活码
    • 加密的key或者salt为硬编码,如MD5的salt
    1. 直接查看源码,发现vendor key的值image-20200811151649007

      image-20200811151649007

    第三关 不安全的数据存储—第一部分

    产生原因:使用了SharedPreferences类,该类是Android平台上一个轻量级的存储类,主要是用来保存一些常用的配置,本例中是用该类存储了用户名和密码,因此是具有风险的。SharedPreferences类存储的数据会以.xml的形式存储在/data/data/app的包名/shared_prefs目录下。

    1. 首先随意输入用户名和密码 admin/admin 点击保存

      image-20200811153842786

    2. 进入shell模式,在/data/data/jakhar.aseem.diva/shared_prefs/目录中查看jakhar.aseem.diva_preferences.xml文件,也可以输入adb pull /data/data/jakhar.aseem.diva/shared_prefs ./将文件复制出来查看

      image-20200811164407315

      image-20200811164541884

    3. 在InsecureDataStorage1Activity.class中可以看到产生风险的地方

      image-20200815181426611

    第四关 不安全的数据存储—第二部分

    产生原因:将敏感数据保存在本地的sqlite3数据库中,对应的数据库目录: /data/data/app的包名/databases

    1. 同样先输入admin/123456

      image-20200811165554921

    2. 进入/data/data/jakhar.aseem.diva/databases/目录中sqlite3查看数据库文件ids2

      image-20200811172439018

    3. 在InsecureDataStorage2Activity.class中可以看到产生风险的地方

      image-20200815190211378

    第五关 不安全的数据存储—第三部分

    产生原因:将敏感数据保存在临时文件中,对应的临时文件目录: /data/data/app的包名/

    1. 同样输入之后,进入/data/data/jakhar.aseem.diva/目录中查看该目录下临时文件uinfo-1464421317tmp

      image-20200811173035572

    2. 在InsecureDataStorage3Activity.class中可以看到产生风险的地方

      image-20200815193110274

    第六关 不安全的数据存储—第四部分

    产生原因:将敏感数据保存在sd卡中,对应的目录一般在: /mnt/sdcard,也可以通过logcat查看保存路径。

    1. 进入/mnt/sdcard/目录中查看存储sd卡的文件.unifo.txt

      image-20200811173828485

      image-20200811173935070

    2. 在InsecureDataStorage4Activity.class中可以看到产生风险的地方

      image-20200815193510197

    第七关 输入校验问题—第一部分

    产生原因:某些不安全控件内输入sql或其他数据库的一些语句,因为在使用前未进行检验长度和过滤等操作,从而达到欺骗服务器执行恶意代码影响到数据库的数据

    1. 首先输入test'和test''试探一下,test'什么也不返回,而test''正常返回

      image-20200815202333461

    2. 输入万能密码test' or '1'='1尝试,即得到了所有用户的数据

      image-20200815202559965

    3. 在SQLInjectionActivity.class中可以看到并没有对输入数据进行处理且语句直接拼接

      image-20200815203546733

    第八关 输入校验问题—第二部分

    产生原因:在处理转跳时存在漏洞,导致允许从http域跨向file域,实现跨域漏洞,在 File 域下,同源策略跨域访问则能够对私有目录文件进行访问

    1. 输入一段url点击可以看到访问了这个页面

      image-20200815210259873

      image-20200815210340793

    2. 将http协议换成File协议,查看之前存储在sd卡的账号文件

      image-20200815211115018

    3. 在InputValidation2URISchemeActivity.class中可以看到并没有对输入数据进行处理直接loadUrl

      image-20200815211232034

      扩展:webview域控制不严格漏洞
      先看Android里的WebViewActivity.java,当其他应用启动此 Activity 时, intent 中的 data 直接被当作 url 来加载(假定传进来的 url 为 file:///data/local/tmp/attack.html ),其他 APP 通过使用显式 ComponentName 或者其他类似方式就可以很轻松的启动该 WebViewActivity 并加载恶意url。

      image-20210623164054136

      解决方案:

      对于不需要使用 file 协议的应用,禁用 file 协议:

      image-20210623164130611

      对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。

      image-20210623164145492

      方法分析:

      1、setAllowFileAccess()
      使用 file 域加载的 js代码能够使用进行同源策略跨域访问,从而导致隐私信息泄露,如果不允许使用 file 协议,则不会存在上述的威胁,但同时也限制了 WebView 的功能,使其不能加载本地的 html 文件。

      2、setAllowFileAccessFromFileURLs()
      设置为false,禁止从 file url 中加载的 js 代码读取其它本地文件,在Android 4.1前默认允许,在Android 4.1后默认禁止。

      3、setAllowUniversalAccessFromFileURLs()
      设置为false,禁止从 file url 中加载的 js 代码可以访问其他的源(包括http、https等源)。

    第九关 访问控制问题—第一部分

    1. 点击按钮获取到API 凭据

      image-20200815212844848

    2. 而我们的目标是不使用按钮就获取到API凭据。

      查看diva-beta.apk/AndroidManifest.XML文件,查看和供应商API凭据提供相关的activity

      image-20200815220317197

      通过观察代码发现,这个activity被intent filter所“保护”,当intent filter被activity等组件使用,这个activity可能会被外部任何应用程序所调用

    3. adb启动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
      am start: 启动activity 管理工具
      -a:指定action
      -n:指定完整 component 名
      命令详情:https://developer.android.google.cn/studio/command-line/adb#am
      
    4. 之后模拟器上就弹出了之前的凭据页面

    第十关 访问控制问题—第二部分

    1. 从题目里可得注册后才能拥有tveeter API Credentials,所以要通过不注册来获取API Credentials

      image-20200815222056279

    2. 尝试上一关的方式

      image-20200815222523059

      结果跳到了未注册时的activity,这表明程序做了相应的措施

      image-20200815222552930

    3. 查看源码APICreds2Activity.class

      image-20200815222935244

      可以看到,getIntent获取到上个activity传来的boolean值(2131492985),当这个值为false时才视为用户已注册,再看看上个activity,查看AccessControl2Activity.class

      image-20200815223343631

      这个类中bool值是通过单选项来决定的,而且把值传给下个activity,这时我们可以使用–ez来传递一个boolean键值对,但是还要获取到2131099686值对应的key值是什么。

    4. 一般情况下使用apktool反编译的字符串文件存放在apktoo/diva-beta/res/vaules/strings.xml文件下,在反编译的情况下所有的索引值都保存在strings.xml同目录下的public.xml文件中,所以,我们现在public中查看16进制的2131099686(0x7f060026)对应的name值

      image-20200815225354469

      然后再strings文件下查找chk_pin,最后得到key 为check_pin

      image-20200815225437369

    5. 最后adb启动activity命令,成功弹出

      $adb shell am start -a jakhar.aseem.diva.action.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity --ez check_pin false
      

    第十一关 访问控制问题—第三部分

    1. 由题可知,这是个私人笔记app,一开始需要设置密码才能使用,现在我们尝试不设置密码就开始使用。

      image-20200815225835893

    2. 同样查看AndroidManifest.XML文件

      image-20200815230210171

      这里使用了ContentProvider,android:enabled表示是否能由系统初始化,android:exported表示是否能被其他应用使用,android:authorities标识这个ContentProvider,调用者可以根据这个标识来找到它,看到2个值都为true,我们就可以使用content://访问里面的数据了,查看包含content://的字符串文件apktool/diva-beta/smali/jakhar/aseem/diva/NotesProvider.smali

      image-20200815230742748

      和我们在AndroidManifest所看到的一样

    3. 我们可以使用以下命令随意的访问该uri

      $adb shell content query –-uri content://jakhar.aseem.diva.provider.notesprovider/notes
      

      image-20200815231026340

    第十二关 硬编码—第二部分

    1. 查看源码Hardcode2Activity.class,这里使用了DivaJni类

      image-20200815231409886

      点击查看 DivaJni.class

      image-20200815231558444

      这里加载了divajni库,一般库文件都放在/lib下,在目录下找到libdivajni.so文件,linux下可以使用strings方便的查看二进制文件里的字符串

      $strings libdivajni.so
      

      image-20200815232802827

    2. 逐个尝试,发现olsdfgad;lh成功

      image-20200815233013938

    第十三关 输入校验问题—第三部分

    1. 正常输入

      image-20200815233255666

    2. 当输入超级多的数据时,程序崩溃了

      image-20200815233441760

    3. 查看logcat可以发现缓冲区溢出了

    4. 查看源码,可以看到这里使用的是strcpy,使用strcpy_s更加安全

      image-20210420173724982

      image-20210420173731301

    欢迎关注我的公众号,同步更新喔

    作者:yoyodan
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    三层架构及生活实例
    初识ADO.NET
    remoting与socket、web service的比较及实例
    ERP与MES
    25人赛跑问题-得出前三名
    WPF导学目录
    心目中的职业初规划
    应用服务器
    2015广深骑行记
    ASP.NET的几个试题(《C#与.NET程序员面试宝典》)
  • 原文地址:https://www.cnblogs.com/Iamyoyodan/p/14923579.html
Copyright © 2011-2022 走看看