wuzhicms代码审计
字数 1467 2025-09-01 11:25:53
WuzhiCMS 4.1.0 代码审计报告
一、环境准备
-
下载源码:
- 百度网盘链接: https://pan.baidu.com/s/1fVsmBHV_0gp4qWEvQuB2Lw
- 提取码: rh9j
-
系统要求:
- PHP版本需大于5.2.0
- 检查代码:
if(PHP_VERSION < '5.2.0') die('Require PHP > 5.2.0 ');
-
核心文件结构:
- 入口文件:
index.php - 核心框架文件:
coreframe/core.php - 配置文件:
configs/web_config.php
- 入口文件:
二、MVC架构分析
-
核心参数:
m(module):模块f(function):功能v(view):视图- 定义位置:
application.class.php中的__construct()方法
-
类加载机制:
- 通过
load_class()函数加载核心类 - 类文件路径:
coreframe/app/{$m}/libs/class/{$class}.class.php - 扩展类命名:
EXT_{$class}.class.php
- 通过
三、漏洞审计
1. XSS漏洞(后台)
位置:后台"我的提问"功能
测试过程:
- 输入测试语句
<s被过滤 - 需要进一步测试其他XSS向量
2. XSS漏洞(前台搜索)
位置:前台搜索功能
过滤机制:
/被过滤,转为HTML编码#和;也被过滤- 需要闭合标签测试
3. 验证码绕过
位置:登录验证码
漏洞详情:
- 配置文件
web_config.php中TEST_CHECKCODE设置为0时正常验证 - 但实际测试中不输入验证码可直接绕过
相关代码:
define('TEST_CHECKCODE',0); //1 打开测试验证码,0 正常验证码
验证码生成逻辑:
- 默认生成4位随机验证码
- 当
TEST_CHECKCODE=1时,固定为"AAAA"
4. SQL注入漏洞
位置:会员组删除功能
漏洞文件:coreframe/app/member/admin/group.php
漏洞详情:
$GLOBALS['groupid']未经过滤直接拼接到SQL语句- 通过
delete()方法执行
利用方式:
http://wuzhicms:90/index.php?m=member&f=group&v=del&groupid=1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)&_su=wuzhicms&%20menuid=86&callback=jQuery111105555776097227751_1667533450920&=1667533450921
漏洞调用链:
group.php中的del()方法- 调用
$this->db->delete() - 最终执行
mysql.class.php中的query()方法
关键代码:
final public function delete($table, $where = '') {
$where = $this->array2sql($where);
return $this->master_db->delete($table, $where);
}
四、数据库操作分析
-
核心SQL执行方法:
query():执行原始SQL语句get_param_sql():参数化查询get_page_list_count():获取分页计数get_page_list():获取分页数据
-
SQL注入风险点:
delete()方法中$where参数直接拼接listing()方法中$keywords直接拼接到SQL语句
危险代码示例:
if(isset($GLOBALS['keywords'])) {
$keywords = $GLOBALS['keywords'];
$where = "`name` LIKE '%$keywords%'";
}
五、修复建议
-
XSS漏洞:
- 对所有用户输入进行HTML实体编码
- 实现严格的输出过滤
-
验证码绕过:
- 强制验证码检查,无论配置如何
- 服务器端验证验证码有效性
-
SQL注入:
- 使用预处理语句
- 对
$GLOBALS变量进行严格过滤 - 在
array2sql()方法中增加过滤逻辑
-
其他建议:
- 更新PHP版本要求(当前最低5.2.0已过时)
- 实现CSRF防护机制
- 加强日志记录功能
六、免责声明
- 本文提供的技术信息仅供参考
- 使用本文信息需遵守《中华人民共和国网络安全法》
- 作者及发布平台不对因使用本文信息导致的任何直接或间接责任负责