导语:在上一篇文章安卓应用程序渗透测试七​中,我们已经讲到了不安全的外部存储和内部存储,还有不安全的通信。本文继续讲解其他问题。

在上一篇文章安卓应用程序渗透测试七中,我们已经讲到了不安全的外部存储和内部存储,还有不安全的通信。本文继续讲解其他问题。

攻击Content Provider

在开始之前,建议先阅读一下关于Content Provider的相关内容,在安卓应用程序渗透测试五中有介绍,当一个app想跟另外一个app共享数据时,Content Provider至关重要,所以读一下还是很有帮助的。

Content Provider通过处理其他app的请求来管理对结构化数据集的访问。所有的访问请求都会调用Content Resolver,然后再通过Content Resolver去调用具体的Content Provider方法进行访问。

常用方法如下:

Query(),Insert(),Update(),Delete(),GetType(),OnCreate()。

因为这些方法跟数据库操作一样,所以我们需要检测URI中是否存在注入。

我们可以使用drozer这个工具来检测是否存在注入

首先执行如下命令:

Run scanner.provider.finduris –a

2.png

接着执行下面这条命令:

Run scanner.provider.injection -a

3.png

Content query --uri

4.png

缓解措施

· 如果content provider只在你的app使用,那么应该在manifest文件中设置为:android:exported=false

· 如果你想导出content provider,你也应该为其他一个或多个app设置读写权限。

· 如果你使用content provider只在你自己的app之间共享数据,那么最好将android:protectionLevel的属性设置为“signature”保护,即签名保护。

· 访问content provider时,使用参数化查询方法,如query(),update()和delete()等,这样可以避免来自不信任源的潜在SQL注入攻击。

不安全的加密技术

目前,绝大部分web应用都采用密码技术来保护敏感数据。但是,敏感数据没有加密的情况也是很普遍的。即使那些应用进行了加密,也是不安全的,因为他们通常采用的是设计存在问题的密码技术,要么使用不恰当的密码,要么使用了强密码,但是却犯了严重的错误。这些问题就会导致敏感数据泄露和违规操作等。

如图,采用的是base64加密:(严格来说base64并不是加密技术,而是一种编码方式)

5.jpg

可以使用Burpsuite进行base64解码就能得到用户名,如图:

6.jpg

通过逆向得到用于身份验证算法的源代码,如图:

7.png

然后使用AES-Exploit对密码进行破解,可以得出密码,如图:

8.jpg

缓解措施

· 不使用不安全的加密算法,比如MD5/SHA1。选择更安全的加密算法,比如SHA256,甚至更好的算法。

· 离线生成密钥对并小心谨慎的存储私钥,千万不要在不安全的通道中传输密钥。

· 重点保护基础设施的凭证,比如数据库凭证或MQ队列访问详情,通过使用严格的文件系统权限和控制进行保护,或者采用安全的加密技术,且不容易被本地用户和远程用户进行破解。

· 确保存储在磁盘中的加密数据没那么轻易破解。例如,如果数据库连接池进行未加密的访问,那么数据库加密是没有意义的。

源码中的硬编码密码

· 硬编码密码可能会损害系统安全,而且损害之后难以补救。

· 千万不要对密码进行硬编码。硬编码不仅能让所有的项目开发人员看到密码,而且会让修复问题变得异常困难。

· 一旦代码投入使用,密码就无法修改,除非对软件进行打补丁升级。如果使用密码保护的账户遭到入侵,那问题就大了,系统所有者将不得不在安全性和可用性之间做出选择。

源链接

Hacking more

...