PHP代码审计之wuzhicms
字数 2015 2025-08-25 22:58:20

WuzhiCMS 代码审计与漏洞分析报告

环境搭建

  1. 下载 WuzhiCMS 最新版本
  2. 配置 PHP 运行环境(建议 PHP 5.6-7.4)
  3. 配置数据库并安装系统

系统架构分析

核心框架流程

  1. 入口文件 index.php 包含 coreframe 框架下的 core.php 文件
  2. 调用 load_class 加载核心类
  3. 实例化 WUZHI_application 类并调用其 run() 方法获取路由信息

路由机制

  • 路由访问规律:index.php?m=模块&f=文件&v=方法&_su=wuzhicms
  • 示例路由:index.php?m=attachment&f=index&v=ueditor&_su=wuzhicms

漏洞审计与分析

1. SQL 注入漏洞

位置/coreframe/app/member/admin/group.phpdel() 函数

漏洞分析

  1. 133 行检查 groupid 参数是否存在且非空
  2. 134 行判断 groupid 是否为数组
  3. 调用 delete() 函数(位于 db.class.php
  4. SQL 语句未经任何过滤直接拼接执行
  5. 错误时会直接暴露 SQL 语句,导致报错注入

漏洞复现

GET /index.php?m=member&f=group&v=del&groupid=1 AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT(version(),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)y) HTTP/1.1

2. 任意文件写入漏洞

位置coreframe/app/attachment/admin/index.phpueditor() 函数

漏洞分析

  1. ueditor() 函数调用 set_cache() 函数
  2. $GLOBALS['setting'] 参数可控
  3. 未设置 submit 参数时通过 get_cache() 读取缓存文件内容

漏洞复现

GET /index.php?m=attachment&f=index&v=ueditor&_su=wuzhicms&submit=XXX&setting=<?php phpinfo();?> HTTP/1.1

3. CSRF 漏洞

位置coreframe/app/core/admin/power.phpadd() 函数

漏洞分析

  1. 用于添加管理员功能
  2. 35-37 行检查提交操作和用户名
  3. 40 行检查用户是否已是管理员
  4. 44-51 行处理密码设置
  5. 54 行将数据插入数据库
  6. 缺乏 CSRF 防护措施

利用方式
构造恶意页面诱导管理员访问,实现后台管理员账户添加

4. 目录遍历漏洞

位置:使用 glob 函数的功能点

漏洞分析

  1. glob() 函数的 $dir 参数可控
  2. 通过 template() 函数渲染 listing.tpl.php 文件
  3. 过滤机制仅替换一次,可通过 ...../// 形式绕过

漏洞复现

GET /index.php?dir=.....///etc/passwd&m=attachment&f=index&v=dir&_su=wuzhicms HTTP/1.1

5. 任意文件删除漏洞

位置my_unlink() 函数调用处

漏洞分析

  1. 用于删除附件功能
  2. 需要传入 idurl 参数
  3. remove_xs() 函数进行过滤但可绕过
  4. 不传入 id 参数时直接删除指定的 $path

漏洞复现

GET /index.php?v=del&url=qr_image/mobile.png&m=attachment&f=index&_su=wuzhicms HTTP/1.1

6. 后台 SQL 注入

位置copyfrom.phplisting 函数

漏洞分析

  1. 调用 get_list 函数,传入 $where 参数
  2. $keywords 通过 $GLOBALS 获取且未充分过滤
  3. 闭合方式为 %'

漏洞复现

GET /index.php?m=core&f=copyfrom&v=listing&_su=wuzhicms&keywords=%27 HTTP/1.1

7. 前台 SQL 注入

位置api 目录下的 sms_check 文件

漏洞分析

  1. 调用 get_one 函数,参数通过 $code 拼接
  2. $code 通过 $GLOBALS 获取 param 的值
  3. 仅使用 strip_tags() 过滤 HTML 标签
  4. 二次编码可绕过过滤

漏洞复现

GET /api/sms_check?param=1' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT(version(),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)y)-- HTTP/1.1

8. RCE 漏洞

位置/wuzhicms/coreframe/app/attachment/admin/index.php

漏洞分析

  1. 传递动态函数 sumit 时调用 set_cache() 方法
  2. $cache_path 为缓存路径,$filename 为缓存文件名
  3. file_put_contents 无过滤写入 $data
  4. 缓存文件被包含时可执行任意代码

利用方式

  1. 写入恶意代码到缓存文件
  2. 触发包含执行

9. 敏感信息泄露

位置:多处功能点

漏洞分析

  1. 缺乏对敏感信息的访问控制
  2. 错误信息暴露系统路径等敏感数据

10. 逻辑漏洞

位置www/api/uc.php

漏洞分析

  1. 通过传参可调用 uc_note 类的任意方法
  2. 类似 zzcms2021 的利用方式

修复建议

  1. 对所有用户输入进行严格的过滤和验证
  2. 使用预处理语句防止 SQL 注入
  3. 实现 CSRF 防护机制
  4. 限制文件操作函数的参数
  5. 加强错误处理,避免敏感信息泄露
  6. 实施严格的权限控制
  7. 更新到最新版本或应用官方补丁

参考资源

  1. WuzhiCMS 官方文档
  2. 先知社区 - WuzhiCMS 漏洞分析
  3. PHP 安全编程指南
WuzhiCMS 代码审计与漏洞分析报告 环境搭建 下载 WuzhiCMS 最新版本 配置 PHP 运行环境(建议 PHP 5.6-7.4) 配置数据库并安装系统 系统架构分析 核心框架流程 入口文件 index.php 包含 coreframe 框架下的 core.php 文件 调用 load_class 加载核心类 实例化 WUZHI_application 类并调用其 run() 方法获取路由信息 路由机制 路由访问规律: index.php?m=模块&f=文件&v=方法&_su=wuzhicms 示例路由: index.php?m=attachment&f=index&v=ueditor&_su=wuzhicms 漏洞审计与分析 1. SQL 注入漏洞 位置 : /coreframe/app/member/admin/group.php 的 del() 函数 漏洞分析 : 133 行检查 groupid 参数是否存在且非空 134 行判断 groupid 是否为数组 调用 delete() 函数(位于 db.class.php ) SQL 语句未经任何过滤直接拼接执行 错误时会直接暴露 SQL 语句,导致报错注入 漏洞复现 : 2. 任意文件写入漏洞 位置 : coreframe/app/attachment/admin/index.php 的 ueditor() 函数 漏洞分析 : ueditor() 函数调用 set_cache() 函数 $GLOBALS['setting'] 参数可控 未设置 submit 参数时通过 get_cache() 读取缓存文件内容 漏洞复现 : 3. CSRF 漏洞 位置 : coreframe/app/core/admin/power.php 的 add() 函数 漏洞分析 : 用于添加管理员功能 35-37 行检查提交操作和用户名 40 行检查用户是否已是管理员 44-51 行处理密码设置 54 行将数据插入数据库 缺乏 CSRF 防护措施 利用方式 : 构造恶意页面诱导管理员访问,实现后台管理员账户添加 4. 目录遍历漏洞 位置 :使用 glob 函数的功能点 漏洞分析 : glob() 函数的 $dir 参数可控 通过 template() 函数渲染 listing.tpl.php 文件 过滤机制仅替换一次,可通过 ...../// 形式绕过 漏洞复现 : 5. 任意文件删除漏洞 位置 : my_unlink() 函数调用处 漏洞分析 : 用于删除附件功能 需要传入 id 和 url 参数 remove_xs() 函数进行过滤但可绕过 不传入 id 参数时直接删除指定的 $path 漏洞复现 : 6. 后台 SQL 注入 位置 : copyfrom.php 的 listing 函数 漏洞分析 : 调用 get_list 函数,传入 $where 参数 $keywords 通过 $GLOBALS 获取且未充分过滤 闭合方式为 %' 漏洞复现 : 7. 前台 SQL 注入 位置 : api 目录下的 sms_check 文件 漏洞分析 : 调用 get_one 函数,参数通过 $code 拼接 $code 通过 $GLOBALS 获取 param 的值 仅使用 strip_tags() 过滤 HTML 标签 二次编码可绕过过滤 漏洞复现 : 8. RCE 漏洞 位置 : /wuzhicms/coreframe/app/attachment/admin/index.php 漏洞分析 : 传递动态函数 sumit 时调用 set_cache() 方法 $cache_path 为缓存路径, $filename 为缓存文件名 file_put_contents 无过滤写入 $data 缓存文件被包含时可执行任意代码 利用方式 : 写入恶意代码到缓存文件 触发包含执行 9. 敏感信息泄露 位置 :多处功能点 漏洞分析 : 缺乏对敏感信息的访问控制 错误信息暴露系统路径等敏感数据 10. 逻辑漏洞 位置 : www/api/uc.php 漏洞分析 : 通过传参可调用 uc_note 类的任意方法 类似 zzcms2021 的利用方式 修复建议 对所有用户输入进行严格的过滤和验证 使用预处理语句防止 SQL 注入 实现 CSRF 防护机制 限制文件操作函数的参数 加强错误处理,避免敏感信息泄露 实施严格的权限控制 更新到最新版本或应用官方补丁 参考资源 WuzhiCMS 官方文档 先知社区 - WuzhiCMS 漏洞分析 PHP 安全编程指南