YCCMS代码审计(新手教学方向)
字数 1391 2025-08-25 22:58:40

YCCMS代码审计教学文档

前言

YCCMS是一款存在多个常见漏洞的内容管理系统,本教学文档将详细分析其存在的安全漏洞,包括未授权更改管理员账号密码、任意文件删除和任意文件上传等漏洞,帮助新手理解这些漏洞的成因及修复方法。

基础知识

YCCMS采用MVC框架:

  • Model:存放数据文件(model文件夹)
  • View:存放视图文件(view文件夹)
  • Controller:存放控制器文件(controller文件夹)

漏洞分析

1. 未授权更改管理员账号密码

漏洞描述

在未登录的情况下,通过构造特定URL可更改数据库中admin账号的用户名和密码。

漏洞利用

构造URL修改usernamepasswordnotpassword参数即可更改管理员账号。

代码分析

漏洞位于controller/AdminAction.class.php中的update函数:

public function update(){
    if(isset($_POST['send'])){
        // 验证输入是否为空
        if(validate::isNullString($_POST['username'])) Tool::t_back('用户名不能为空','?a=admin&m=update');
        if(validate::isNullString($_POST['password'])) Tool::t_back('密码不能为空!','?a=admin&m=update');
        if(!(validate::checkStrEquals($_POST['password'], $_POST['notpassword']))) Tool::t_back('两次密码不一致!','?a=admin&m=update');
        
        $this->_model->username=$_POST['username'];
        $this->_model->password=sha1($_POST['password']);
        $_edit=$this->_model->editAdmin();
        // ...
    }
}

editAdmin()函数位于model/AdminModel.class.php

public function editAdmin(){
    $_sql="UPDATE my_admin SET username='$this->username', password='$this->password' WHERE id=1 LIMIT 1";
    return parent::update($_sql);
}

漏洞成因

  1. 缺少权限验证,未检查用户是否登录
  2. 直接拼接用户输入到SQL语句中
  3. 固定更新id=1的管理员账号

修复建议

  1. 添加权限验证
  2. 对输入进行严格过滤
  3. 使用参数化查询

2. 任意文件删除

漏洞描述

在未登录情况下,通过构造POST请求可删除服务器上的任意文件。

漏洞利用

POST请求示例:

POST /admin/?a=pic&m=delall HTTP/1.1
...
pid%5B0%5D=../1.txt&chkall=on&send=%E5%88%A0%E9%99%A4%E9%80%89%E4%B8%AD%E5%9B%BE%E7%89%87t

代码分析

漏洞位于controller/PicAction.class.php中的delall函数:

public function delall(){
    if(isset($_POST['send'])){
        if(validate::isNullString($_POST['pid'])) tool::layer_alert('没有选择任何图片!','?a=pic',7);
        $_fileDir=ROOT_PATH.'/uploads/';
        foreach($_POST['pid'] as $_value){
            $_filePath=$_fileDir.$_value;
            if(!unlink($_filePath)){
                tool::layer_alert('图片删除失败,请设权限为777!','?a=pic',7);
            }else{
                header('Location:?a=pic');
            }
        }
    }
}

漏洞成因

  1. 未对用户输入的路径进行过滤
  2. 直接拼接用户输入到文件路径中
  3. 缺少权限验证

修复建议

  1. 添加权限验证
  2. 对输入路径进行严格过滤
  3. 限制可删除的文件范围

3. 任意文件上传(两种方式)

第一种上传方式

漏洞描述

通过伪造Content-Type可上传任意文件。

代码分析

漏洞位于controller/CallAction.class.php中的upLoad函数:

public function upLoad() {
    if (isset($_POST['send'])) {
        $_logoupload = new LogoUpload('pic',$_POST['MAX_FILE_SIZE']);
        $_path = $_logoupload->getPath();
        // ...
    }
}

LogoUpload类位于public/class/LogoUpload.class.php

private function checkType() {
    if (!in_array($this->type,$this->typeArr)) {
        Tool::alertBack('警告:LOGO图片必须是PNG格式!');
    }
}
private $typeArr = array('image/png','image/x-png');
漏洞成因

仅检查Content-Type,可被伪造

第二种上传方式

漏洞描述

同样通过伪造Content-Type上传任意文件。

代码分析

漏洞位于controller/CallAction.class.php中的xhUp函数:

public function xhUp() {
    if (isset($_GET['type'])) {
        $_fileupload = new FileUpload('filedata',10);
        $_err=$_fileupload->checkError();
        $_path = $_fileupload->getPath();
        // ...
    }
}

FileUpload类位于public/class/FileUpload.class.php

private function checkType() {
    if (!in_array($this->type,$this->typeArr)) {
        Tool::alertBack('警告:不合法的上传类型!');
    }
}
private $typeArr = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif');

上传漏洞修复建议

  1. 使用文件内容检测而非Content-Type
  2. 使用白名单验证文件扩展名
  3. 设置上传目录不可执行
  4. 重命名上传文件

4. 其他漏洞

  1. 验证码重放漏洞:验证码可重复使用
  2. 反射型XSS漏洞
    http://xxx.xxx/admin/?a=html&art=<sCrIpT>alert(1)<%2FsCrIpT>&m=arts
    

总结与修复方案

  1. 权限控制:对所有敏感操作添加权限验证
  2. 输入过滤
    • SQL注入:使用参数化查询
    • 文件操作:严格过滤路径中的特殊字符
    • 文件上传:使用白名单验证文件类型和内容
  3. 安全配置
    • 设置上传目录不可执行
    • 限制文件操作的范围
  4. 验证码安全:使用一次性验证码

参考资源

CMS下载地址: http://ahdx.down.chinaz.com/202003/yccms_v3.4.rar

通过本教学文档,新手可以学习到常见Web漏洞的代码审计方法和修复方案,提高代码安全意识。

YCCMS代码审计教学文档 前言 YCCMS是一款存在多个常见漏洞的内容管理系统,本教学文档将详细分析其存在的安全漏洞,包括未授权更改管理员账号密码、任意文件删除和任意文件上传等漏洞,帮助新手理解这些漏洞的成因及修复方法。 基础知识 YCCMS采用MVC框架: Model :存放数据文件(model文件夹) View :存放视图文件(view文件夹) Controller :存放控制器文件(controller文件夹) 漏洞分析 1. 未授权更改管理员账号密码 漏洞描述 在未登录的情况下,通过构造特定URL可更改数据库中admin账号的用户名和密码。 漏洞利用 构造URL修改 username 、 password 和 notpassword 参数即可更改管理员账号。 代码分析 漏洞位于 controller/AdminAction.class.php 中的 update 函数: editAdmin() 函数位于 model/AdminModel.class.php : 漏洞成因 缺少权限验证,未检查用户是否登录 直接拼接用户输入到SQL语句中 固定更新id=1的管理员账号 修复建议 添加权限验证 对输入进行严格过滤 使用参数化查询 2. 任意文件删除 漏洞描述 在未登录情况下,通过构造POST请求可删除服务器上的任意文件。 漏洞利用 POST请求示例: 代码分析 漏洞位于 controller/PicAction.class.php 中的 delall 函数: 漏洞成因 未对用户输入的路径进行过滤 直接拼接用户输入到文件路径中 缺少权限验证 修复建议 添加权限验证 对输入路径进行严格过滤 限制可删除的文件范围 3. 任意文件上传(两种方式) 第一种上传方式 漏洞描述 通过伪造Content-Type可上传任意文件。 代码分析 漏洞位于 controller/CallAction.class.php 中的 upLoad 函数: LogoUpload 类位于 public/class/LogoUpload.class.php : 漏洞成因 仅检查Content-Type,可被伪造 第二种上传方式 漏洞描述 同样通过伪造Content-Type上传任意文件。 代码分析 漏洞位于 controller/CallAction.class.php 中的 xhUp 函数: FileUpload 类位于 public/class/FileUpload.class.php : 上传漏洞修复建议 使用文件内容检测而非Content-Type 使用白名单验证文件扩展名 设置上传目录不可执行 重命名上传文件 4. 其他漏洞 验证码重放漏洞 :验证码可重复使用 反射型XSS漏洞 : 总结与修复方案 权限控制 :对所有敏感操作添加权限验证 输入过滤 : SQL注入:使用参数化查询 文件操作:严格过滤路径中的特殊字符 文件上传:使用白名单验证文件类型和内容 安全配置 : 设置上传目录不可执行 限制文件操作的范围 验证码安全 :使用一次性验证码 参考资源 CMS下载地址: http://ahdx.down.chinaz.com/202003/yccms_ v3.4.rar 通过本教学文档,新手可以学习到常见Web漏洞的代码审计方法和修复方案,提高代码安全意识。