第一次花这么长时间测一个漏洞(主要时间都花在写demo上了。。。),求加精
1.苏宁易购Android最新版客户端使用的是通过本地xml文件和db方式存储用户登录凭证的。
(1)/data/data/com.suning.mobile.ebuy/shared_prefs/EbuyPerferences.xml
其中的
xxxx
xxxxxxxxxxxxx(16位密文)
分别保存了用户的明文用户名与加密过后的密码
(2)/data/data/com.suning.mobile.ebuy/databases/SUNINGEBUY.DB中的table_login_history表同样保存着明文的username与加密过后的password
2.在正常情况下这样保存用户凭证问题不大,因为就算木马(读取应用私有文件需ROOT权限)获取了相关文件也不知道用户密码是多少。但经过分析,由于设计缺陷,用户密码可被逆向分析进行解密。
(1)使用JEB反编绎其APK安装包,以logonPassword为关键词进行初步查找,分析其调用的加/解密方法;
(2)当跟踪到package com.suning.mobile.ebuy.login.login.ui;下的类p(被混淆过的类名)时,发现调用了如下方法:
看包名这应该是个和登录相关的方法,先是通过getPreferencesVal方法读取了xml文件中的logonPassword值赋值给v2,然后通过getPreferencesPassword(v1, v2)来解密出明文密码进行登录,其中的v1是通过getTop5LoginHistory()方法取了登录历史中最后一次登录的用户名。
(3)继续分析getPreferencesPassword方法:
这里直接将传入的两个参数(明文用户名,加密后的密码)传递到了PBECoder类的decrypty方法,然后返回一个字符串值,看这个名字就能猜到是用来解密的~
(4)继续跟踪分析PBECoder类decrypty方法:
调用了decrypt方法,这里decrypt方法传入的三个参数值的第一参数值是PBECoder.hex2byte(arg3)是指将传入arg3(加密后的密码)从hex转换成了byte值,arg2为明文用户名,PBECoder.salt为salt值。继续跟踪调用的decrypt方法
发现这里用的是PBE算法加密,PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。如上就混杂了MD5与DES加密,是一种简便的加密方式。看着很安全?
(5)继续分析发现此其salt取值方法是直接设置为sn201209:
static {
PBECoder.salt = "sn201209".getBytes();
}
而正确的生成salt的方法是取随机值:
public static byte[] initSalt() throws Exception {
byte[] salt = new byte[8];
Random random = new Random();
random.nextBytes(salt);
return salt;
}
这样产生了一个问题,我们能获取解密要用的用户名与加密后的密码又逆向出来了salt值与其解密方法,我们完全可以自己写个相同的解密方法。
最后。。。经过三天的编写。。。demo终于出炉了(第一次写完整的android应用,改了多少报错就不说了。。。)