学校一个某网站,说是后台密码忘记了.然后把源码和数据库拿下来研究了一下(其实就是开源的帝国CMS)
登录的关键函数位于/e/class/adminfun.php
还记得当年高中的网站用的也是帝国CMS,当时还想着能不能xxx,现在一看当时还是说有点太年轻(虽然现在也很年轻,哈哈)..
直接贴程序了
<?php
/*
* @Author: yumusb
* @Date: 2019-06-17 09:22:50
* @LastEditors: yumusb
* @LastEditTime: 2019-06-17 09:22:52
* @Description: 直接放到帝国CMS根目录运行即可
*/
define('EmpireCMSAdmin', '1');
if (!file_exists('./e/class/connect.php')) {
exit("Please PUt THis File into The EmpireCMS's root dir !!");
}
require("./e/class/connect.php");
require("./e/class/db_sql.php");
$link = db_connect();
$empire = new mysqlquery();
function ReturnHLoginQuestionStr($userid, $question, $answer)
{
$pass = md5(md5('-#20empire27#-' . $question . '-empirecms-' . $userid . '-www.phome.net-' . $answer . '-wm-') . '-dg2002-' . $answer . '-wm_chief-' . $userid . '-wangmeng-');
return $pass;
}
function DoEmpireCMSAdminPassword($password, $salt, $salt2)
{
$pw = md5($salt2 . 'E!m^p-i(r#e.C:M?S' . md5(md5($password) . $salt) . 'd)i.g^o-d' . $salt);
return $pw;
}
/*编辑密码*/
function EditPassword($username, $password)
{
global $empire, $dbtbpre, $gr;
$a = '';
$salt = make_password(8);
$salt2 = make_password(20);
$password1 = DoEmpireCMSAdminPassword($password, $salt, $salt2);
$a = "password='$password1',salt='$salt',salt2='$salt2'";
$sql = $empire->query("update {$dbtbpre}enewsuser set " . $a . " where username='$username'");
if ($sql) {
echo "{$username}的密码已经修改{$password}";
}
}
/*重新设置安全密码*/
function EditQuestion($userid, $question, $answer)
{
global $empire, $dbtbpre;
if (!is_numeric($userid) || !is_numeric($userid)) {
exit("userid and question must be `int` ");
}
$answerstr = ReturnHLoginQuestionStr($userid, $question, $answer);
$a = "equestion='$question',eanswer='$answerstr'";
$sql = $empire->query("update {$dbtbpre}enewsuseradd set " . $a . " where userid=$userid");
if ($sql) {
echo "用户ID{$userid}的安全问题已经修改为: (问题:{$question} 对应答案{$answer} 对应答案密文{$answerstr}";
}
}
/*删除安全密码*/
function DelQuestion($userid)
{
global $empire, $dbtbpre;
if (!is_numeric($userid)) {
exit("userid must be `int`");
}
$sql = $empire->query("update {$dbtbpre}enewsuseradd set equestion=0,eanswer=null WHERE userid=$userid");
if ($sql) {
echo "用户ID{$userid}的安全密码已经删除";
}
}
//EditPassword("admin","admin");
//EditQuestion("1","4","0");
DelQuestion("x");
ReturnHLoginQuestionStr
与 DoEmpireCMSAdminPassword
都是帝国自带的函数,可以看到有关密码的 都是加了盐后多次加密的.
如注释中所写的那样,一共有三个功能.
- 编辑密码(应该叫修改指定密码才对)
调用函数
EditPassword("admin","admin");
其中admin分别是用户名和密码,注意这里的用户名一定要是数据库中存在的. - 编辑指定的安全问答
调用函数
EditQuestion("1","4","0");
1是指的是用户ID,4指的是问题ID,0指的就是答案咯. - 删除指定用户的安全问答
调用函数
DelQuestion("1");
这里面的1是用户ID(根据帝国的机制,删除问答并不是删除这个用户相关的问答表,而是指定该用户不开启问答)
还有一个问题就是,刚开始想到的办法是直接新增一行管理员数据,但是只这样是不可行的,因为帝国会判断问答表里面是否指定该用户不开启问答.如果真的要新增管理员的话,还需要改动问答表相关内容!