无聊之中想出来的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的方法之一
By:心灵