学校一个某网站,说是后台密码忘记了.然后把源码和数据库拿下来研究了一下(其实就是开源的帝国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 都是帝国自带的函数,可以看到有关密码的 都是加了盐后多次加密的.

如注释中所写的那样,一共有三个功能.

  1. 编辑密码(应该叫修改指定密码才对) 调用函数EditPassword("admin","admin");其中admin分别是用户名和密码,注意这里的用户名一定要是数据库中存在的.
  2. 编辑指定的安全问答 调用函数EditQuestion("1","4","0"); 1是指的是用户ID,4指的是问题ID,0指的就是答案咯.
  3. 删除指定用户的安全问答 调用函数DelQuestion("1"); 这里面的1是用户ID(根据帝国的机制,删除问答并不是删除这个用户相关的问答表,而是指定该用户不开启问答)

还有一个问题就是,刚开始想到的办法是直接新增一行管理员数据,但是只这样是不可行的,因为帝国会判断问答表里面是否指定该用户不开启问答.如果真的要新增管理员的话,还需要改动问答表相关内容!