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

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

缺陷编号: WooYun-2015-152291

漏洞标题: PHPCMS设计缺陷可重置前台任意用户密码

相关厂商: phpcms

漏洞作者: loopx9认证白帽子

提交时间: 2015-11-06 12:39

公开时间: 2015-12-17 14:48

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

危害等级: 中

自评Rank: 10

漏洞状态: 厂商已经确认

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

Tags标签: 设计缺陷 php源码分析

8人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-11-06: 细节已通知厂商并且等待厂商处理中
2015-11-06: 厂商已经确认,细节仅向厂商公开
2015-11-09: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2015-12-31: 细节向核心白帽子及相关领域专家公开
2016-01-10: 细节向普通白帽子公开
2016-01-20: 细节向实习白帽子公开
2015-12-17: 细节向公众公开

简要描述:

验证逻辑设计缺陷.

详细说明:

\phpcms\modules\member\index.php:

code 区域
//通过用户名找回密码
public function public_forget_password_username() {
$step = intval($_POST['step']);
$step = max($step,1);
$this->_session_start();

if(isset($_POST['dosubmit']) && $step==2) {
//处理提交申请,以手机号为准
if ($_SESSION['code'] != strtolower($_POST['code'])) {
showmessage(L('code_error'), HTTP_REFERER);
}
$username = safe_replace($_POST['username']);

$r = $this->db->get_one(array('username'=>$username),'userid,email');
if($r['email']=='') {
$_SESSION['userid'] = '';
$_SESSION['code'] = '';
showmessage("该账号没有绑定手机号码,请选择其他方式找回!");
} else {
$_SESSION['userid'] = $r['userid'];
$_SESSION['email'] = $r['email'];
}
$email_arr = explode('@',$r['email']);
include template('member', 'forget_password_username');
} elseif(isset($_POST['dosubmit']) && $step==3) {
$sms_report_db = pc_base::load_model('sms_report_model');
$mobile_verify = $_POST['mobile_verify'];
$email = $_SESSION['email'];
if($email){
if(!preg_match('/^([a-z0-9_]+)@([a-z0-9_]+).([a-z]{2,6})$/',$email)) exit('check email error');
if($_SESSION['emc_times']=='' || $_SESSION['emc_times']<=0){
showmessage("验证次数超过5次,验证码失效,请重新获取邮箱验证码!",HTTP_REFERER,3000);
}
$_SESSION['emc_times'] = $_SESSION['emc_times']-1;
if($_SESSION['emc']!='' && $_POST['email_verify']==$_SESSION['emc']) {

$userid = $_SESSION['userid'];
$updateinfo = array();
$password = random(8,"23456789abcdefghkmnrstwxy");
$encrypt = random(6,"23456789abcdefghkmnrstwxyABCDEFGHKMNRSTWXY");
$updateinfo['encrypt'] = $encrypt;
$updateinfo['password'] = password($password, $encrypt);

$this->db->update($updateinfo, array('userid'=>$userid));
$rs = $this->db->get_one(array('userid'=>$userid),'phpssouid');
if(pc_base::load_config('system', 'phpsso')) {
//初始化phpsso
$this->_init_phpsso();
$this->client->ps_member_edit('', '', '', $password, $rs['phpssouid'], $encrypt);
}
$_SESSION['email'] = '';
$_SESSION['userid'] = '';
$_SESSION['emc'] = '';
$_SESSION['code'] = '';
pc_base::load_sys_func('mail');
sendmail($email, '密码重置通知', "您在".date('Y-m-d H:i:s')."通过密码找回功能,重置了本站密码。");
include template('member', 'forget_password_username');
exit;
} else {
showmessage("验证码错误!请重新获取!",HTTP_REFERER,3000);
}
} else {
showmessage("非法请求!");
}
} else {
include template('member', 'forget_password_username');
}
}

//邮箱获取验证码
public function public_get_email_verify() {
pc_base::load_sys_func('mail');
$this->_session_start();
$code = $_SESSION['emc'] = random(8,"23456789abcdefghkmnrstwxy");
$_SESSION['emc_times']=5;
$message = '您的验证码为:'.$code;

sendmail($_SESSION['email'], '邮箱找回密码验证', $message);
echo '1';
}



通过用户名找回密码方式存在设计缺陷。找回密码流程可分作三步来看:

步骤1: 客户端提交用户名,服务端在数据库中查询记录,如果存在此用户就在session中保存用户身份信息;

步骤2: 生成验证码并保存在session,然后将验证码发往用户注册邮箱;

步骤3: 服务端将客户端提交的验证码与session中保存的进行比对,验证通过后重置用户密码。

从代码中可以看到验证码没有绑定用户身份,这样就导致可以使用用户A的验证码来重置用户B的密码。

使用用户A(可控账户)走正常密码找回流程来获取验证码,但不使用,然后再使用用户B(要攻击的账户)走步骤1,接着跳过步骤2使用前面获取到的验证码直接走步骤3,就能重置用户B的密码了。

漏洞证明:

http://**.**.**.**/index.php?m=member&c=index&a=public_get_password_type

选择“通过用户名找回密码”

输入自己的账户获取验证码:

-1.png



0.png



1.png



回到第一步输入要重置的用户名:

3.png



使用前边获取的验证码直接重置密码:

4.png



5.png



登录成功:

6.png

修复方案:

将步骤1步骤2合为一步或者验证码绑定用户身份

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2015-11-06 14:17

厂商回复:

感谢发现

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2015-11-06 12:41 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:933 漏洞数:107 )
    0

    前排

  2. 2015-11-06 12:43 | 小川 认证白帽子 ( 核心白帽子 | Rank:1583 漏洞数:236 | 一个致力要将乌云变成搞笑论坛的男人)
    0

    纳尼

  3. 2015-11-06 12:43 | DNS ( 普通白帽子 | Rank:748 漏洞数:81 | root@qisec.com)
    0

    打雷/

  4. 2015-11-06 13:02 | h3hz ( 实习白帽子 | Rank:42 漏洞数:5 )
    0

    刘明

  5. 2015-11-06 13:19 | 啊L川 认证白帽子 ( 普通白帽子 | Rank:195 漏洞数:39 | 菜鸟 ,菜渣, 菜呀!)
    0

    卧槽

  6. 2015-11-06 13:22 | qhwlpg ( 普通白帽子 | Rank:260 漏洞数:64 | http://sec.tuniu.com)
    0

    我擦

  7. 2015-11-06 14:00 | Looke ( 普通白帽子 | Rank:1227 漏洞数:154 | Shell)
    0

    我去

  8. 2015-11-06 14:01 | 泳少 ( 普通白帽子 | Rank:248 漏洞数:82 | ★ 梦想这条路踏上了,跪着也要...)
    0

    ..

  9. 2015-11-06 14:32 | 小红猪 ( 普通白帽子 | Rank:322 漏洞数:58 | little red pig!)
    0

    牛逼

  10. 2015-11-06 14:40 | 大师兄 ( 实习白帽子 | Rank:31 漏洞数:8 | 每日必关注乌云)
    0

  11. 2015-11-06 15:17 | 带头大哥 ( 普通白帽子 | Rank:760 漏洞数:226 | |任意邮件伪造| |目录遍历| |任意文件读取|...)
    0

    验证码 发表评论 

  12. 2015-11-06 15:19 | 大师兄 ( 实习白帽子 | Rank:31 漏洞数:8 | 每日必关注乌云)
    1

    @带头大哥 女娲上面那位是你么?(*^__^*)

  13. 2015-11-10 17:02 | Walle ( 路人 | Rank:0 漏洞数:5 | ... 位卑、未敢忘忧国! ...)
    0

    我靠

  14. 2015-12-06 17:20 | HaLit ( 路人 | Rank:2 漏洞数:1 | 做个优秀的白帽子)
    0

    顶1

  15. 2016-01-10 14:54 | 深夜买醉 ( 路人 | Rank:6 漏洞数:2 | 没啥好介绍的,大牛太多了)
    0

    是不是两个username=? 后面用'可以注入 那个

登录后才能发表评论,请先 登录