首先我只是菜鸟,连PHP基本语法也不太懂。下面是我个人分析结果,如有错误,敬请见谅。
主要问题出在找回密码:member.php?action=getpw。
看代码:
case 'getpw':
$showsubmenu = 0;
$log_status && showmsg($lang['login_already'], $forward);
if (isset($_POST['submit'])) {
$msg = $_POST['hash'] == $ghash ? '' : $lang['hash_error'];
if ($set_captcha[1]) {
$msg or check_captcha($_POST['captcha']) or $msg = $lang['checkcode_error'];
}
$username = trim($_POST['username']);
$email = trim($_POST['email']);
if (!($member -> checkuser($username, 0) && $member -> checkemail($email, 0))) { // 0表示不检测是否存在
showmsg($member -> info);
}
$r = $member -> get(0, '`userid`,`email`,`question`,`answer`', "username='$username'");
if ($r) {
$answer = shtmlspecialchars($_POST['answer']);
if ($r['email'] != $email) showmsg($lang['email_name_error']);
elseif ($r['question'] && $answer != $r['answer']) showmsg($lang['answer_error']);
else {
$newpwd = substr(gethash($TIME . $IP), 6, 12);
$member -> modipwd($r['userid'], '', $newpwd, $newpwd, 1) or showmg($member -> info);
include JXCMS_ROOT . 'include/mail.func.php';
$mail_subject = &$lang['getpw_emailtitle'];
$mail_content = sprintf($lang['mail_body'], $username, $lang['your_new_password'] . $newpwd, $set_ceomail, $set_contact);
if ($set_sendtype == 'mail') {
basic_sendmail($email, $set_ceomail, $set_name, $mail_subject, $mail_content, 'html');
} elseif ($set_sendtype == 'nmail') {
nmail($email, $set_ceomail, $set_name, $mail_subject, $mail_content, 'html');
} elseif ($set_sendtype == 'smtp') {
smtp_sendmail($email, $set_ceomail, $set_name, $mail_subject, $mail_content, 'html');
}
showmsg($lang['getpw_sucess'], 'login.php', 3000);
}
} else showmsg($lang['email_name_error']);
}
include tpl('getpw');
break;
|
主要是:“$newpwd = substr(gethash($TIME . $IP), 6, 12);”,在公用函数文件中 $TIME 定义是 time(),$IP 自定义就是当前客户端IP。
看 gethash:
function gethash($str) {
$str = md5($str . $GLOBALS['set_sid']);
$tmp = str_split($str, 1);
$tmp = array_unique($tmp);
return implode ('', $tmp);
}
|
新密码就是这样生成出来的。“$GLOBALS['set_sid']”默认是空的(这里是基本条件之一,如果管理员在后台填写了安全码,那就没办法了。)。
这个程序有个留言本,随便留个言就可显示当时留言时间,然后把自己电脑时间改成服务器时间前几秒。再在本地搭建这个程序,就可以虚构“$newpwd = substr(gethash($TIME . $IP), 6, 12);”。
然后“echo $newpwd”就是修改后的密码。然后问题在时间上,可以从前几秒一直试到最后几秒,然后一个一个试密码就知道了。
“admin”的默认 Email 是 [email protected],80%的人是不去修改的,这个是前提条件!
这个程序最大设计失误是,后台管理账号和会员账号同放在“member”这个表里。
可能研究得复杂点,但本地架设测试成功的,没试过网上其他网站。总的来说很鸡肋,需要默认的 admin 邮箱没改和默认的安全码没写才行。
文章来源于lcx.cc:【漏洞】精迅 CMS 新闻 内容管理系统漏洞
相关推荐: T00ls.Net 论坛已永久关闭,T00ls 已成为过去了
团队简介: T00ls.Net 是当前国内最大的民间网络安全团队,团队本着“低调求发展”的理念进行发展,严格控制人员的加入,已经成为国内讨论气氛浓厚、研究范围较广的技术交流平台!团队无任何盈利与商业性质,本着低调发展、技术讨论的原则进行交流,和谐发展! …
评论