wuzhicms代码审计
字数 1467 2025-09-01 11:25:53

WuzhiCMS 4.1.0 代码审计报告

一、环境准备

  1. 下载源码:

    • 百度网盘链接: https://pan.baidu.com/s/1fVsmBHV_0gp4qWEvQuB2Lw
    • 提取码: rh9j
  2. 系统要求:

    • PHP版本需大于5.2.0
    • 检查代码:if(PHP_VERSION < '5.2.0') die('Require PHP > 5.2.0 ');
  3. 核心文件结构:

    • 入口文件:index.php
    • 核心框架文件:coreframe/core.php
    • 配置文件:configs/web_config.php

二、MVC架构分析

  1. 核心参数:

    • m (module):模块
    • f (function):功能
    • v (view):视图
    • 定义位置:application.class.php中的__construct()方法
  2. 类加载机制:

    • 通过load_class()函数加载核心类
    • 类文件路径:coreframe/app/{$m}/libs/class/{$class}.class.php
    • 扩展类命名:EXT_{$class}.class.php

三、漏洞审计

1. XSS漏洞(后台)

位置:后台"我的提问"功能

测试过程

  • 输入测试语句<s被过滤
  • 需要进一步测试其他XSS向量

2. XSS漏洞(前台搜索)

位置:前台搜索功能

过滤机制

  • /被过滤,转为HTML编码
  • #;也被过滤
  • 需要闭合标签测试

3. 验证码绕过

位置:登录验证码

漏洞详情

  • 配置文件web_config.phpTEST_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

漏洞调用链

  1. group.php中的del()方法
  2. 调用$this->db->delete()
  3. 最终执行mysql.class.php中的query()方法

关键代码

final public function delete($table, $where = '') {
    $where = $this->array2sql($where);
    return $this->master_db->delete($table, $where);
}

四、数据库操作分析

  1. 核心SQL执行方法:

    • query():执行原始SQL语句
    • get_param_sql():参数化查询
    • get_page_list_count():获取分页计数
    • get_page_list():获取分页数据
  2. SQL注入风险点:

    • delete()方法中$where参数直接拼接
    • listing()方法中$keywords直接拼接到SQL语句

危险代码示例

if(isset($GLOBALS['keywords'])) {
    $keywords = $GLOBALS['keywords'];
    $where = "`name` LIKE '%$keywords%'";
}

五、修复建议

  1. XSS漏洞:

    • 对所有用户输入进行HTML实体编码
    • 实现严格的输出过滤
  2. 验证码绕过:

    • 强制验证码检查,无论配置如何
    • 服务器端验证验证码有效性
  3. SQL注入:

    • 使用预处理语句
    • $GLOBALS变量进行严格过滤
    • array2sql()方法中增加过滤逻辑
  4. 其他建议:

    • 更新PHP版本要求(当前最低5.2.0已过时)
    • 实现CSRF防护机制
    • 加强日志记录功能

六、免责声明

  1. 本文提供的技术信息仅供参考
  2. 使用本文信息需遵守《中华人民共和国网络安全法》
  3. 作者及发布平台不对因使用本文信息导致的任何直接或间接责任负责
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时正常验证 但实际测试中不输入验证码可直接绕过 相关代码 : 验证码生成逻辑 : 默认生成4位随机验证码 当 TEST_CHECKCODE=1 时,固定为"AAAA" 4. SQL注入漏洞 位置 :会员组删除功能 漏洞文件 : coreframe/app/member/admin/group.php 漏洞详情 : $GLOBALS['groupid'] 未经过滤直接拼接到SQL语句 通过 delete() 方法执行 利用方式 : 漏洞调用链 : group.php 中的 del() 方法 调用 $this->db->delete() 最终执行 mysql.class.php 中的 query() 方法 关键代码 : 四、数据库操作分析 核心SQL执行方法: query() :执行原始SQL语句 get_param_sql() :参数化查询 get_page_list_count() :获取分页计数 get_page_list() :获取分页数据 SQL注入风险点: delete() 方法中 $where 参数直接拼接 listing() 方法中 $keywords 直接拼接到SQL语句 危险代码示例 : 五、修复建议 XSS漏洞: 对所有用户输入进行HTML实体编码 实现严格的输出过滤 验证码绕过: 强制验证码检查,无论配置如何 服务器端验证验证码有效性 SQL注入: 使用预处理语句 对 $GLOBALS 变量进行严格过滤 在 array2sql() 方法中增加过滤逻辑 其他建议: 更新PHP版本要求(当前最低5.2.0已过时) 实现CSRF防护机制 加强日志记录功能 六、免责声明 本文提供的技术信息仅供参考 使用本文信息需遵守《中华人民共和国网络安全法》 作者及发布平台不对因使用本文信息导致的任何直接或间接责任负责