它是用TP开发的,就简单分析一下~~~
在它的Application/Home/Controller/MembersController.class.php中有如下代码:
public function varify_email(){ $token = I('get.token','','trim'); $return_url_arr = array('1'=>U('Company/user_security'),'2'=>U('Personal/user_safety')); if($token){ $token = str_replace(C('URL_HTML_SUFFIX'), '', $token); $verify = explode("-", $token); $uid = decrypt($verify[0]); $email = decrypt($verify[1]); // var_dump($uid,$email,encrypt('2'),encrypt('[email protected]'));exit; $time = $verify[2]; if($time+3600*24>=time()){//24小时内有效 $userinfo = D('Members')->where(array('uid'=>$uid))->find(); if(!$userinfo){ $this->error('邮箱验证失败!',$return_url_arr[$userinfo['utype']]); } $setsqlarr['email']=$email; $setsqlarr['email_audit']=1; if(false === $reg = M('Members')->where(array('uid'=>$uid))->save($setsqlarr)) $this->error('邮箱验证失败!',$return_url_arr[$userinfo['utype']]); if(!$reg){ $this->success("你的邮箱 {$email} 已经通过验证!",$return_url_arr[$userinfo['utype']]); return; } $user_visitor = new /Common/qscmslib/user_visitor; $user_visitor->logout(); $user_visitor->assign_info($userinfo); D('Members')->update_user_info($setsqlarr,$userinfo); if ($userinfo['utype']=="1"){ $r = D('TaskLog')->do_task($userinfo,23); }else{ $r = D('TaskLog')->do_task($userinfo,16); } write_members_log($userinfo,8001); if($r['data']){ $sub = '增加'.$r['data'].C('qscms_points_byname'); }else{ $sub = ''; } $this->success('邮箱验证通过!'.$sub,$return_url_arr[$userinfo['utype']]); }else{ $this->error('该链接已过期',$return_url_arr[$userinfo['utype']]); } } else { $this->error('链接无效',$return_url_arr[$userinfo['utype']]); } }
用户uid和email都是通过decrypt()解密得到的
$uid = decrypt($verify[0]); $email = decrypt($verify[1]);
中间用到了一个解密函数decrypt(),如下所示:
function decrypt($txt, $key = '_qscms') { // $txt 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起, // 经过 passport_key() 函数处理后的返回值 $txt = passport_key(base64_decode($txt), $key); // 变量初始化 $tmp = ''; // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数 for ($i = 0; $i < strlen($txt); $i++) { // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位, // 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1 $tmp .= $txt[$i] ^ $txt[++$i]; } // 返回 $tmp 的值作为结果 return $tmp; }
我没有看解密函数是否可逆,只注意了key是固定值~~~因此,在前面我们可以构造出请求包进行邮箱验证。而且,在后面存在一个问题,验证完成之后直接登录了。
$user_visitor = new /Common/qscmslib/user_visitor; $user_visitor->logout(); $user_visitor->assign_info($userinfo); D('Members')->update_user_info($setsqlarr,$userinfo);
作者:该隐
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论