作者:心灵

    无聊之中想出来的 0DAY (反正最后能拿下 WEBSHELL 都叫 0DAY 吧……)

    但前提要求条件比较苛刻,看完就明白……

    经典对白,看代码……

member\index_do.php:

else if($fmdo=='login')
//   http://127.0.0.1/member/index_do.php?fmdo=login&dopost=login
就来到这步了
{
    //用户登录
    if($dopost=="login")
    {
        if(!isset($vdcode))
        {
            $vdcode = '';
        }
        $svali = GetCkVdValue();
        if(preg_match("/2/",$safe_gdopen)){
            if(strtolower($vdcode)!=$svali || $svali=='')
            {
                ResetVdValue();
                ShowMsg('验证码错误!', '-1');
                exit();
            }
           
        }
        if(CheckUserID($userid,'',false)!='ok')
        {
            ShowMsg("你输入的用户名 {$userid} 不合法!","-1");
            exit();
        }
        if($pwd=='')
        {
            ShowMsg("密码不能为空!","-1",0,2000);
            exit();
        }

        //检查帐号
        $rs = $cfg_ml->CheckUser($userid,$pwd);       
         //检测用户名密码  这里不会出现提示错误  因为还要运行下面代码
        #api{{
        if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php')
        {
            //苛刻条件之一  已经整合DZ 并安装了UCCLIENT这个插件
            //检查帐号
            list($uid, $username, $password, $email) = uc_user_login($userid, $pwd);
//登录DEDECMS的同时也登录DZ
            if($uid > 0) {
                $password = md5($password);
                //当UC存在用户,而CMS不存在时,就注册一个   
                if(!$rs) {   //如果DEDECMS登录不成功
                    //会员的默认金币
                    $row = $dsql->GetOne("SELECT `money`,`scores` FROM `#@__arcrank` WHERE `rank`='10' ");
                    $scores = is_array($row) ? $row['scores'] : 0;
                    $money = is_array($row) ? $row['money'] : 0;
                    $logintime = $jointime = time();
                    $loginip = $joinip = GetIP();
                    $res = $dsql->ExecuteNoneQuery("INSERT INTO #@__member SET `mtype`='个人',`userid`='$username',`pwd`='$password',`uname`='$username',`sex`='男' ,`rank`='10',`money`='$money', `email`='$email', `scores`='$scores', `matt`='0', `face`='',`safequestion`='0',`safeanswer`='', `jointime`='$jointime',`joinip`='$joinip',`logintime`='$logintime',`loginip`='$loginip';");

//漏洞就这样形成了  当DZ的用户全在的话 就会建立到DEDECMS里

    经测试,只有密码替换!

简单来说,登录DEDECMS验证就是:

    如果DEDE账号登录成功,就同时登录DZ,如果DZ登录不成功,就在DZ建立一个一样账号密码的。
    反之,登录DEDECMS不成功,就在DZ里提取账号,登录成功了就把账号密码写入DEDECMS。

利用前提条件:
    第一、整合DZ。
    第二、管理员账号不能是ADMIN,因为DZ管理员默认也是ADMIN。
    第三、DEDE那边管理员没从前台登录,和知道管理员账号。

    这样在DZ里注册一个和DEDE一样的管理员账号,然后从DEDE那里登录,就覆盖了DEDE的管理员密码。

    然后修改基本资料,改一次密码,就覆盖了后台密码,然后就可以登录后台直接拿WEBSHELL。

    总的来说,条件苛刻!但也是有可能拿下WEBSHELL的方法之一。