App安全测试之Android应用安全测试汇总

敏感信息明文传输

用例风险:如果在传输过程中未对敏感数据进行加密传输,存在被恶意攻击者通过网络窃听等手段获取网络数据包中的敏感数据的威胁。

执行步骤

1、安装应用后,触发应用功能。

2、同时开启抓取数据包工具(如Charles),查看数据包中是否明文包含:用户名密码、IP地址、SIM序列号,或其他用户、系统等敏感信息。

3、如发现代码内包含以上信息,就说明存在应用中存在敏感数据,记录漏洞,停止测试。

预期结果:传输的数据包中未包含敏感信息。

整改建议:确保包含重要敏感信息的数据均已加密的形式或者以https形式传输。

Java层ssl中间人攻击漏洞

用例风险

在密码学和计算机安全领域中,中间人攻击(Man-in-the-middle attack,缩写:MITM)是指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容

执行步骤

1、使用反编译工具打开应用,反编译出应用源码。

2、在源码中搜索类似写法:

 public class SSLSocketFactory_poc extends SSLSocketFactory {
            SSLContext sslContext = SSLContext.getInstance("TLS");            
            public SSLSocketFactory_poc(KeyManager[] keys,KeyStore truststore ) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
                super(truststore);

                TrustManager tm = new X509TrustManager() {
                    public void checkClientTrusted(X509Certificate[] chain, String authType)  {
                        if(true)
                        {}
                        try {
                            throw new CertificateException("illegal DN, reject the connection");
                        } catch (CertificateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }

                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
                    }

                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                };

                sslContext.init(keys, new TrustManager[] { tm }, null);
            }
            ...
        }s(), "js2java");

3、检测代码中是否实现域名判断逻辑,未实现域名判断逻辑的代码如下:

HostnameVerifier hostnameVerifier = new HostnameVerifier(){
        public boolean verify(String hostname, SSLSession session)
            {
                return true; #未实现任何判断语句,直接返回true
            };
        };

4、检测代码中是否允许所有域名,允许所有域名的代码如下:

SSLSocketFactory sf = new SSLSocketFactory_poc(null,trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  #允许所有域名
sf.setHostnameVerifier(new AllowAllHostnameVerifier());

5、如果在使用证书的时候,像示例代码中的写法类似,未进行域名相关判断、允许所有域名的证书,则风险存在。

预期结果:在使用证书的时候进行相关校验。

整改建议:建议开发者对SSL证书进行强校验,包括证书是否合法、主机域名是否合法和证书的有效期。

3、数据存储测试

日志中包含敏感信息

安全风险

如果日志中包含用户信息、业务信息,攻击者可以通过抓取日志,搜集整理大量的有用信息。比如有时研发开发时为了调试方便会添加一些debug日志,如果在打正式发布包时不将这些log去掉那么很容易泄漏敏感信息。

执行步骤

1、安装应用后,对应用进行使用。

2、同时使用adb logcat | find "com.youku.phone"(包名)"捕获输出的日志。

3、还可以使用命令adb logcat | find "com.youku.phone" >C:UsersShuqingDesktoplog.txt将日志保存到指定文件。

4、如果输出的日志中包含敏感信息,记录漏洞,停止测试。

预期结果:日志中不包含敏感信息。

整改建议:为了防止信息泄漏,不要在日志中输出敏感数据。

敏感数据明文存储

安全风险:敏感数据明文存储在手机上增加了信息泄露的风险。

执行步骤

1、使用软件(如:好压)打开apk安装文件查找是否明文存储用户信息、业务数据、服务信息或其他敏感信息。

2、如果存在,记录漏洞,停止测试。

预期结果:文件中未存放用户或系统敏感信息。

整改建议:如果一定要在客户端存放系统敏感数据,建议加密后再存储。

安装文件权限检测

安全风险:应用文件被分配了不合理的权限,导致其他应用可以读取和获取文件内容,增加了内容泄露的风险。

执行步骤

1、使用adb shell连接设备。

2、进入应用目录cd /data/data/xxxx(包名) 。

3、执行命令ls -al,查看当前目录下所有文件权限。(r代表只读,w代表写,x代表可执行,d表示是一个目录)

4、文件权限为:文件主-组用户-其他用户 。

预期结果

  • 目录权限为drwxrwx--x,允许多一个执行位x。
  • 文件权限最后三位应为空(类似-rw-rw----),即除应用自己以外任何人无法读写。

整改建议

  • 避免使用MODE_WORLD_WRITEABLE(可写)和MODE_WORLD_READABLE(可读)模式创建进程间通信的文件,如果需要与其他进程应用进行数据共享,请考虑使用content provider
  • 避免使用MODE_PRIVATE模式创建内部存储文件,默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
  • 避免将密码等敏感数据信息明文存储在文件中;为文件使用合适的权限。

数据库敏感数据泄露

安全风险:敏感数据直接存储在sqlite数据库导致信息泄露的风险。

执行步骤

1、使用进入应用安装文件目录/data/data/[package name]/databases/,查找sqlite数据库文件并复制到PC端。



留言