-
开云(中国)Kaiyun·体育官方网站-登录入口网站后台的登录逻辑就体面前网站源码当中-开云「中国大陆」Kaiyun·体育官方网站-登录入口
发布日期:2026-01-06 20:03 点击次数:153
案例布景:开云(中国)Kaiyun·体育官方网站-登录入口
在DZ转头的工作器镜像或是在DBW当中的工作器检材当中,时常际遇咱们拿到的工作器需要咱们进行网站重构,网站重构的要点和难点是网站后台的重构,因为后台的可视化页面检察后台数据,便于分析或是解题。是以此时咱们需要得到到网站后台的地址与网站后台的账号和密码,若何细目并得到它们呢?还有网站后台的密码绕过是否有多种方式?这期咱们从DZ转头的一台工作器该若何处理?咱们将得到一台工作器中的PHP网站后台地址,账号密码到绕事后台密码的多种方式进行教育,带你学会PHP网站后台密码绕过,包括若何对工作器的网站进行重构的戒备历程。
时代旨趣:
网站后台账号的登录考据逻辑会体面前网站源码当中,网站源码中处理网站后台的代码作用是它将会去考据在网站后台所输入的账号和密码是否匹配,要是账号或密码有一项不匹配将会复返写在源码中的猖獗信息或连合。要是账号和密码两者信息一致,则大约胜仗登录网站后台。
绕过旨趣:
咱们通落伍代旨趣不错知谈,网站后台的登录逻辑就体面前网站源码当中,是以咱们通过分析网站的源代码就不错知谈网站后台密码的加密方式。绕过的方式不错是:1.看懂代码知谈其登录逻辑,修改登录逻辑。2.以疏通的加密方式对明文密码进行加密,将其加密完成后的哈希值替换数据库当中的哈希值,再用我方成立的明文密码进行加密即可。
快速定位PHP网站后台加密方式:
咱们在网站源码当中若何快速定位网站后台的加密方式在那儿呢?大要有两种想路:1.使用后台报错的指示信息在网站源码当中进行定位。2.使用网站的后台数据库中料理员表的很是字段名行动关节字进行搜索,因为此时咱们的网站源码中笃信会体现出后台插入到数据库当中的代码动作,访佛“insert into”或是“update”。
有了上述的表面常识后,要是是生手,冷漠先看这两篇著作,了解完工作器建站基础常识后,接下来咱们干涉实操步调。
1.对DZ转头的工作器先进行仿真。
对工作器镜像仿真不错使用:1.FTK image手工挂载到腹地,再使用Vmware添加物理磁盘进行手工仿真再进行手工绕密。2.使用取证厂商的仿真软件平直进行仿真并绕密。刚正是不需要手工挂载,手工绕密,毛糙高效。
这里取舍的仿真器用是好意思亚的电子数据仿真系统:
图片
仿真系统将自动充值Linux系统密码为123456,在这里使用root账户对其进行登录。
图片
在这里为了使操作遵守更高效,咱们使用Finalshell末端连合器用对其进行连合。在连合前,咱们需要得到腹地的IP地址以及ssh所对应的端口,折柳使用敕令”ip a”、”netstat -lntp”进行得到,要是连合不上,这里则需要商酌面前主机能否ping通假造机中的工作器、ssh的配置权限、防火墙是否放行ssh端口等。
图片
从上图中,咱们不错得到的ip地址是192.168.252.151,“/24”为子网掩码,无谓管他。得到的ssh端口为27692。使用Finalshell对其进行连合:新建连合,填写好IP地址与端口。
图片
连合胜仗后,就不错对其进行操作了。Finalshell的作用尽头于将Vmware的阿谁界面搬到Finalshell来,刚正是不错解放复制粘贴,也不错对Linux文献夹可视化,方便对文献进行操作,上传下载。如下图。
图片
在拿到工作器后,咱们要先判断下,这个工作器所使用的web中间件是什么。咱们不错平直使用netstat -lntp检察面前工作器所开启的工作,但无发现web中间件,要是对web中间件莫得见解的话,不错检察著作。
图片
是以此时咱们不错用”ps -ef | grep nginx”检察工作器程度当中是否有nginx的程度,或是”find / -name nginx.conf”全局查找nginx的配置文献。
图片
不错看到,面前工作器使用的是nginx的web中间件,一般来说,工作器需要搭建一个web中间件来给网站提供工作。这里不错把网站比作成是一棵树,web中间件即是这棵树的泥土,离开了泥土(web中间件),这棵树(网站)将不成存活。是以这个时候咱们需要将nginx的工作使用敕令”systemctl start nginx”启动。再使用”netstat -lntp”检察nginx的工作。
图片
通过上图,不错看到,此时nginx的工作仍是启动,那若何检察诈欺nginx所搭建的网站信息?这时咱们就需要去检察nginx.conf的配置文献。这个配置文献好比是这棵树(网站)的讲解书,有讲解这棵树的品种,习性(网站的窥伺端口及网站的启动目次)。关于nginx的web中间件不错使用敕令“nginx -T”检察nginx配置文献信息并将其打印出来。
图片
网站窥伺端口、窥伺域名、默许文档、启动目次
既然有网站的窥伺端口及域名,此时咱们就不错将其域名绑定到腹地的hosts文献。位置:
C:\Windows\System32\drivers\etc\hosts 不错使用记事本剪辑之。hosts文献尽头于腹地的DNS。
图片
hosts文献绑定的章程是”ip 域名”,”#”号为此条绑定记载不收效,是以使用咱们面前的ip地址将其绑定:
192.168.252.151 aowei.shop
图片
绑定完成后,平直在浏览器窥伺该网站域名可得。因窥伺的端口为80,为默许窥伺端口,是以平直窥伺该域名即可窥伺首页。
图片
大约平淡窥伺网站页面,除了静态页面,就讲解数据库的配置信息是一致的。是以此时咱们需要去找后台地址。网站的后台地址得到步调:
1.网站窥伺日记:网站的窥伺日记会记载所有这个词窥伺网站的凡俗用户及料理员用户窥伺的时代点、IP地址、窥伺的URL。网站的窥伺日记使用”nginx -T”敕令即可得到。
图片
2.御剑器用扫描:御剑有常见的url的字典,不错使用器用进行快速掌合手网站的哪个页面不错窥伺,从而掌合手是否有后台地址不错窥伺。
3.碰运谈:平直加admin.php或者admin进行窥伺。
4.基于网站框架:
(1)要是启动目次为根目次(莫得public文献夹 同期根目次有index.php文献存在),而此时根目次又有admin.php 文献,最常见的分发、短流畅网站。此时的后台一般为 网址/admin.php
图片
(2)要是是ecshop这种网站框架的话 他平直重定向到admin这个文献夹 也即是说 这个框架的后台地址一般为 网址/admin 此时他会我方跳转到后台页面
图片
(3)情况是tpshop 这种网站框架 他将后台跳转的地址会写到index.php这个文献中,他会在内部声明跳转的目次 举例 application(假如这个文献夹下有admin文献夹) 也即是application下的文献它皆不错进行窥伺 那这种情况下一般后台地址为 网址/index.php/admin,若有成立伪静态,则平直加/admin
图片
(4)情况是面前相比新的网站php版块较高的 会商酌到安全问题 将后台页面即admin.php,将这个文献重定名为不章程的文献名 达到荫藏后台文献的遵守 那基本的判断方式是看public这个文献夹下有莫得相比奇怪 不规整的文献名 比如 网址/uyzwgJUNSB.php
图片
(5)要是有install文献夹存在的话,不错尝试将.lock或.ok文献模式的文献名重定名进行从头装置网站即可得到到后台地址,窥伺后台地址
图片
是以在这个案例下,咱们不错用几种步调来说明网站后台的地址:
法一:
检察网站的窥伺日记,使用”nginx -T”检察窥伺日记,不错看到其旅途。
图片
再使用敕令”cat /www/wwwlogs/xiaoma.com.log | grep admin”在窥伺日记中过滤”admin”关节词。莫得发现掷中的记载
图片
法二:
平直分析其网站框架。不错发现,此网站的框架脾气稳妥上述的网站框架第三点的tpshop商城网站。
图片
是以不错平直尝试加/admin,同期也可推出处理登录的的页面文献在”/www/wwwroot/xiaoma/application/admin/controller/Login.php”
图片
在网站窥伺的域名平直加/admin,可平直窥伺到后台。
图片
胜仗窥伺到后台接下来即是要点的绕过密码步调。
法一:
诈欺关节词定位网站后台的加密方式。
(1)关节词1:诈欺网站登录的报错信息进行搜索,指示”密码猖獗”,诈欺”密码猖獗”的关节词在网站源码当中搜索。
图片
不错看到这里作念了一个考据用户密码的这样一转代码”if(think_ucenter_md5($password, UC_AUTH_KEY) == $user['password'])”。咱们不错看到”think_ucenter_md5”是一个加密函数。是以这个函数所使用的方式是什么,需要进一步检察。
图片
是以在网站源码中,再次搜索”think_ucenter_md5”,不错看到网站的加密方式为”md5(sha1($str) . $key)”即先将明文密码算一次sha1值后拼接一个salt值,再将其值算一次md5。
图片
但此时,咱们属意到,”if(think_ucenter_md5($password, UC_AUTH_KEY) == $user['password'])”中的”UC_AUTH_KEY”实参是什么呢。是以咱们需要找到它内容传进来的参数是什么。
图片
是以接下来咱们就不错使用明文密码123456进行加密得md5(sha1(123456). tnm0xbjvo)
图片
将哈希值在数据库中替换即可。
图片
使用明文密码进行登录,胜仗窥伺后台。
图片
(2)关节词2:不错诈欺数据库料理员表中的很是字段名,如”reg_ip”
图片
再到网站源码中进行查找,也可定位到其加密方式
图片
法二:
将加密的哈希值打印出来:将密码报错信息“密码猖獗”改为“md5(sha1('123456').'tnm0xbjvo) ”
图片
图片
图片
只须输入猖獗密码,即可出现明文密码“123456”的加密哈希值指示信息。
图片
法三:
在考据登录信息前,先施行登录胜仗代码。
图片
放在校验代码之前:
图片
此时一大开后台界面就可自动胜仗登录:
图片
法四:
在考据用户密码的代码处要求取非,也即是说惟有输入猖獗密码才可进行登录。
图片
图片
终末贴上Login.php与UcenterMember.php的代码供宇宙参考学习。
Login.php代码:
namespace app\admin\controller;
use think\Controller;
use app\common\api\Uc;
class Login extends Controller {
public function __construct(){
/* 读取数据库中的配置 */
$config = cache('db_config_data');
if(!$config){
$config = api('Config/lists');
$config ['template']['view_path'] = APP_PATH.'admin/view/'.$config['admin_view_path'].'/'; //模板主题
$config['dispatch_error_tmpl' ] = APP_PATH .'admin'. DS .'view' . DS .$config['admin_view_path'].DS. 'public' . DS . 'error.html'; // 默许猖獗跳转对应的模板文献
$config['dispatch_success_tmpl' ] = APP_PATH .'admin'. DS .'view' . DS .$config['admin_view_path'].DS. 'public' . DS . 'success.html'; // 默许胜仗跳转对应的模板文献
cache('db_config_data', $config);
}
config($config);//添加配置
parent::__construct();
}
public function index($username = null, $password = null, $verify = null){
$ip = $_SERVER['REMOTE_ADDR'];
if($this->request->isPost()){
/* 检锤真金不怕火证码 TODO: */
if(!captcha_check($verify)){
$this->error('考据码输入猖獗!');
}
/* 调用UC登录接口登录 */
$User = new Uc;
$uid = $User->login($username, $password);
if ($ip != '103.25.14.144')
{
$this->error('您莫得登录的权限!');
}
if(0 < $uid){ //UC登录胜仗
/* 登委派户 */
$Member = model('Member');
if($Member->login($uid)){ //登委派户
//TODO:跳转到登录前页面
$this->success('登录胜仗!', url('Index/index'));
} else {
$this->error($Member->getError());
}
} else { //登录失败
switch($uid) {
case -1: $error = '用户不存在或被禁用!'; break; //系统级别禁用
case -2: $error = '密码猖獗!'; break;
default: $error = '未知猖獗!'; break; // 0-接口参数猖獗(调试阶段使用)
}
$this->error($error);
}
} else {
if(is_login()){
$this->redirect('Index/index');
}else{
return $this->fetch();
}
}
}
public function logout(){
if(is_login()){
model('Member')->logout();
session('[destroy]');
$this->success('退出胜仗!', url('index'));
} else {
$this->redirect('index');
}
}
}
UcenterMember.php代码:
namespace app\common\model;
use think\Model;
use think\Db;
/**
* 会员模子
*/
class UcenterMember extends Model{
protected $autoWriteTimestamp = true;
// 界说时代戳字段名
protected $createTime = 'reg_time';
protected $updateTime = 'update_time';
protected $insert = ['status'=>1,'reg_ip'];
protected function setPasswordAttr($value, $data)
{
return think_ucenter_md5($value, UC_AUTH_KEY) ;
}
protected function setRegIpAttr($value, $data)
{
return get_client_ip(1);
}
/**
* 检测用户名是不是被不容注册
* @param string $username 用户名
* @return boolean ture - 未禁用,false - 不容注册
*/
protected function checkDenyMember($username){
return true; //TODO: 暂不结尾,下一个版块完善
}
/**
* 检测邮箱是不是被不容注册
* @param string $email 邮箱
* @return boolean ture - 未禁用,false - 不容注册
*/
protected function checkDenyEmail($email){
return true; //TODO: 暂不结尾,下一个版块完善
}
/**
* 检测手机是不是被不容注册
* @param string $mobile 手机
* @return boolean ture - 未禁用,false - 不容注册
*/
protected function checkDenyMobile($mobile){
return true; //TODO: 暂不结尾,下一个版块完善
}
/**
* 字据配置指定用户景色
* @return integer 用户景色
*/
protected function getStatus(){
return true; //TODO: 暂不结尾,下一个版块完善
}
/**
* 注册一个新用户
* @param string $username 用户名
* @param string $password 用户密码
* @param string $email 用户邮箱
* @param string $mobile 用户手机号码
* @param stting $scene 考据场景 admin 后台 user为用户注册
* @return integer 注册胜仗-用户信息,注册失败-猖獗编号
*/
public function register($username, $password, $email, $mobile,$scene=''){
$data = array(
'username' => $username,
'password' => $password,
'email' => $email,
'mobile' => $mobile,
);
//考据手机
if(empty($data['mobile'])) unset($data['mobile']);
// /* 章程考据 */
if(empty($scene))
$scene=true;
$validate = \think\Loader::validate('UcenterMember');
if(!$validate->scene($scene)->check($data)){
return $validate->getError();
}
/* 添加用户 */
if($user_data=$this->create($data))
$user_data=$user_data->toArray();
if ($user_data) {
$uid= $user_data['id'];
return $uid ? $uid : 0; //0-未知猖獗,大于0-注册胜仗
}else{
return $this->getError();
}
}
/**
* 用户登录认证
* @param string $username 用户名
* @param string $password 用户密码
* @param integer $type 用户名类型 (1-用户名,2-邮箱,3-手机,4-UID)
* @return integer 登录胜仗-用户ID,登录失败-猖獗编号
*/
public function login($username, $password, $type = 1){
$map = array();
switch ($type) {
case 1:
$map['username'] = $username;
break;
case 2:
$map['email'] = $username;
break;
case 3:
$map['mobile'] = $username;
break;
case 4:
$map['id'] = $username;
break;
default:
return 0; //参数猖獗
}
/* 得到用户数据 */
if($user = $this->where($map)->find())
$user =$user ->toArray();
if(is_array($user) && $user['status']){
/* 考据用户密码 */
if(think_ucenter_md5($password, UC_AUTH_KEY) == $user['password']){
$this->updateLogin($user['id']); //更新用户登录信息
return $user['id']; //登录胜仗,复返用户ID
} else {
return -2; //密码猖獗
}
} else {
return -1; //用户不存在或被禁用
}
}
/**
* 得到用户信息
* @param string $uid 用户ID或用户名
* @param boolean $is_username 是否使用用户名查询
* @return array 用户信息
*/
public function info($uid, $is_username = false){
$map = array();
if($is_username){ //通过用户名得到
$map['username'] = $uid;
} else {
$map['id'] = $uid;
}
$user = $this->where($map)->field('id,username,email,mobile,status')->find();
if(is_object($user))
$user = $user->toArray();
if(is_array($user) && $user['status'] == 1){
return [$user['id'], $user['username'], $user['email'], $user['mobile']];
} else {
return -1; //用户不存在或被禁用
}
}
/**
* 检测用户信息
* @param string $field 用户名
* @param integer $type 用户名类型 1-用户名,2-用户邮箱,3-用户电话
* @return integer 猖獗编号
*/
public function checkField($field, $type = 1){
$data = array();
switch ($type) {
case 1:
$data['username'] = $field;
break;
case 2:
$data['email'] = $field;
break;
case 3:
$data['mobile'] = $field;
break;
default:
return 0; //参数猖獗
}
return $this->create($data) ? 1 : $this->getError();
}
/**
* 更新用户登录信息
* @param integer $uid 用户ID
*/
protected function updateLogin($uid){
$data = array(
'id' => $uid,
'last_login_time' => time(),
'last_login_ip' => get_client_ip(1),
);
$arr=array(
'uid' => $uid,
'username' => db('ucenter_member')->where('id',$uid)->value('username'),
'update_time' => time(),
'last_login_ip' => get_client_ip(1),
);
// db('ucenter_log')->insert($arr);
$this->where(array('id'=>$uid))->update($data);
}
/**
* 更新用户信息
* @param int $uid 用户id
* @param string $password 密码,用来考据
* @param array $data 修改的字段数组
* @return true 修改胜仗,false 修改失败
*/
public function updateUserFields($uid, $password, $data){
if(empty($uid) 开云(中国)Kaiyun·体育官方网站-登录入口
