yccms

yccms3.4代码审计

一.环境搭建

1.1 源码搭建

  • phpMyAdmin 中创建数据库,导入根目录下的 yccms.sql 文件
  • config.inc.php 配置数据库

1.2X-debug 配置:

出现这样就好了

二.分析

显而易见是 MVC 模式

再回顾各层具体职能:

  • Controller(控制器层):处理客户端(浏览器)请求,调用 Model(模型层)获取或处理数据,再将返回的数据传递给视图
  • model(模型层):存放于数据库交互的 PHP 文件,负责数据的操作,让控制器专注流程控制
  • view(视图层):存放页面展示的 HTML 结构(可能嵌入 PHP 代码做动态渲染),接收控制器传递的数据,将其格式化展示给用户,专注页面呈现

在 Smarty 模板引擎中,<font style="color:rgba(0, 0, 0, 0.85);">.tpl.php</font>文件通常是模板文件经过编译后生成的 PHP 文件

作用:

  1. 内容展示:接收到数据后,模板文件按照预先设计的格式进行展示
  2. 代码复用:多个页面有相同的头部或底部部分,只需写入一个.tpl.php 文件,其他页面模板文件通过包含这个文件复用代码

2.1 漏洞复现

在配置文件中发现它是 3.4 版本的

2.1.1RCE

  1. 全局搜索危险方法:eval(),锁定 Factory.class.php
  • 语法补充:范围解析操作符(**::**:也叫双冒号操作符,用于访问类的静态成员(属性和方法),类常量,还能在子类中访问被覆盖的父类成员和方法 。
  1. 找到了危险方法 eval ,接着看参数是否可控,这里是将由参数$a动态获取到的拼接到Model上,获取对应的模型再实例化对象,并赋值给了Factory类的静态属性$_obj. (看上面$_a 是由 getA()获得的,并且该方法对变量也没有进行过滤)

  2. 利用,可以看到上面有file_exists()函数的检查(检查是否存在该文件路径),该函数允许路径中存在特殊字符,且遇到**<font style="color:rgb(216, 59, 100);background-color:rgb(249, 242, 244);">/../</font>**的时候会返回到上级目录,所以最后 payload:

1
http://yccms:8678/admin/?a=Factory();phpinfo();//../

2.1.2 任意文件上传(一)

  1. 定位到controller\CallAction.class.php。直接不登陆也是可以访问上传文件功能的

这里跟进 LogoUpload 函数,(public/class/LogoUpload.class.php)发现它只有构造方法,返回文件路径,移动文件,重命名,验证目录,验证类型

  1. 可以看到验证类型是检查 MIME,就可以绕过了

源码中还有一个设置新文件名,所以上传的文件会被重命名为 logo

  1. 复现

上传正常的 png 图片,抓包修改添加 php 代码,修改文件名

访问上传路径,成功执行

蚁剑也连接成功!

2.1.3 任意文件上传(二)

路径:controller\CallAction.class.php 中的 xhUp 函数

跟进FileUpload

可以看到验证类型还是检验 MIME 类型

重命名与上面还是有一些变化的,以时间 1-100 之间的随机数进行重命名

复现:

上传正常图片,抓包该包

成功上传到 upload 目录下

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

修改密码的 url:

由 url 定位代码,函数位于 controller\AdminAction.class.php 中的 update 函数

跟进editAdmin()函数,该函数位于 model/AdminModel.class.php,将变量$_sql 传入父类 update 中执行并返回(漏洞主要在这里直接将传入的 username 和 password 拼接到 sql 语句中执行)

看看父类

class AdminModel extends Model

跟进去看一下

位于 model/Model.class.php,看一下 update 函数,调用 execute 函数去执行 sql 语句

然后在未授权的情况下,访问 url,构造数据包,抓正常修改密码的数据包,看一下结构

在未登陆状态下访问,修改数据包,只需更改 username password notpassword 的值

2.1.5 任意文件删除

删除文件功能点:

根据删除文件左下角 url 定位代码位置:/controller/PicAction.class.php

delall(),这里产生漏洞是因为对 pid 传进来的值并没有进行过滤就进行了了路径的拼接,导致了路径穿越漏洞,触发任意文件删除漏洞

复现

当前是在 uploads 下,测试文件在上一级目录

2.1.6XSS

复现


yccms
https://bxhhf.github.io/2025/07/08/yuque-hexo-post/yccms/
作者
bxhhf
发布于
2025年7月8日
许可协议