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 文件
作用:
- 内容展示:接收到数据后,模板文件按照预先设计的格式进行展示
- 代码复用:多个页面有相同的头部或底部部分,只需写入一个.tpl.php 文件,其他页面模板文件通过包含这个文件复用代码
2.1 漏洞复现
在配置文件中发现它是 3.4 版本的
2.1.1RCE
- 全局搜索危险方法:eval(),锁定 Factory.class.php

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

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

2.1.2 任意文件上传(一)
- 定位到controller\CallAction.class.php。直接不登陆也是可以访问上传文件功能的

这里跟进 LogoUpload 函数,(public/class/LogoUpload.class.php)发现它只有构造方法,返回文件路径,移动文件,重命名,验证目录,验证类型
- 可以看到验证类型是检查 MIME,就可以绕过了


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

- 复现
上传正常的 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
复现