[代码审计]Mini CMS V1.1

image-20211116004109525

简介

MiniCMS体积小,代码短小易读,可以详细分析其执行流程。通过学习可以大致熟悉MVC框架的构造,对Web server的后台处理有一个基本了解。

MiniCMS是一个针对个人网站设计的微型内容管理系统。它的特点是:

  1. 不需要数据库在支持,只需要一个可以运行PHP的Web环境
  2. 只针对个人网站设计,没有复杂的成员管理和权限设置
  3. 没有分类只有标签,免除发布文章时到底该怎么分类的纠结
  4. 只有“文章”和“页面”两该个系统,没有“评论”、“插件”、“主题”,让你更专注于创造内容

项目地址:https://github.com/bg5sbk/MiniCMS

安装

  1. 下载最新版的install.php,上传到网站根目录
  2. 浏览器访问根目录下install.php,填入网站信息和初始账号密码
  3. 开始安装

这里我们使用phpstudy搭建,运行环境:

  • Apache 2.4.39
  • PHP 5.6.9

项目结构

│  build.php
│  index.php 整个项目的入口,首先引入核心库mc-core.php,然后进行路由,对路由结果进行相应的渲染,相当于MVC中的C
│  install.txt 复制为php文件后,用来安装MiniCMS
│  README.md
│
├─mc-admin 管理功能的实现
│      conf.php 用户设置页面,包括接收和保存更改的设置
│      editor.php 编辑器的大小、样式调整的库
│      foot.php html<foot>标签构造
│      head.php token 验证,html<head>标签构造;若验证失败,跳转至主页
│      index.php 后台登陆身份验证页面
│      page-edit.php 页面编写处理逻辑,包括显示编辑页面、接收提交的页面、页面序列化储存
│      page.php 管理页面的库,声明加载数据、删除页面、还原页面(从回收站还原)
│      post-edit.php 文章编写处理逻辑,包括显示编辑页面、接收提交的页面、页面序列化储存
│      post.php 管理文章的库,声明加载数据、删除文章、还原文章(从回收站还原)
│      style.css 后台用到的CSS
│
└─mc-files
    │  markdown.php 一个开源的markdown解析库
    │  mc-conf.php 配置文件,包含用户名和密码等敏感信息
    │  mc-core.php 引入mc-tags、mc-conf,声明404函数
    │  mc-rss.php 订购RSS的链接
    │  mc-tags.php 相当于M,引入markdown、包括一些核心函数,包括了加载各种信息的函数(网站名、文章数、前进后退等,中间有各种过滤,可以重点分析)
    │
    ├─pages
    │  └─index
    │          delete.php 使用数组储存了删除页面的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          draft.php 使用数组储存了草稿页面的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          publish.php 使用数组储存了已发布的页面的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │
    ├─posts
    │  ├─data 储存了文章内容的反序列化数据(文章内容等)
    │  └─index
    │          delete.php 使用数组储存了删除的文章的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          draft.php 使用数组储存了草稿文章的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │          publish.php 使用数组储存了已发布文章的信息(id、标题、标签等)与data文件夹内的文章数据一一对应
    │
    └─theme
            index.php 主题文件,决定了页面的风格,将C传入的信息显示出来,相当于V
            style.css 主题使用的CSS风格

代码审计

系统安装完成之后,install.php重命名为install.txt,没有重装漏洞。

越权漏洞

登录逻辑:/mc-admin/index.php

<?php
require_once dirname(dirname(__FILE__)).'/mc-files/mc-conf.php';

if (isset($_COOKIE['mc_token'])) {
  $token = $_COOKIE['mc_token'];

  if ($token == md5($mc_config['user_name'].'_'.$mc_config['user_pass'])) {
    Header("Location:{$mc_config['site_link']}/mc-admin/post.php");
  }
}

if (isset($_POST['login'])) {
  if ($_POST['user'] == $mc_config['user_name'] 
  && $_POST['pass'] == $mc_config['user_pass']) {
    setcookie('mc_token', md5($mc_config['user_name'].'_'.$mc_config['user_pass']));
    Header("Location:{$mc_config['site_link']}/mc-admin/post.php");
  }
}

如果cookie值为md5(user_name+user_pass)则进入管理界面,未设置登出操作,只能清除cookie达到重新登录的目的

权限判断:mc-admin/head.php

<?php
ini_set("display_errors", "On"); error_reporting(E_ALL);
require_once '../mc-files/mc-conf.php';

if (isset($_COOKIE['mc_token'])) {
  $token = $_COOKIE['mc_token'];

  if ($token != md5($mc_config['user_name'].'_'.$mc_config['user_pass'])) {
    Header("Location:index.php");
    exit;
  }
} else {
  Header("Location:index.php");
  exit;
}
------------------<snip>---------------

越权漏洞:mc-admin/post.php

image-20211116003820455

在post.php中188行才引入head.php,而前面的函数已经执行过了,存在越权

我们以文件删除为例:

if (isset($_GET['delete']) || (isset($_GET['apply']) && $_GET['apply'] == 'delete')) {
  if (isset($_GET['apply']) && $_GET['apply'] == 'delete') {
    $ids = explode(',', $_GET['ids']);
    foreach ($ids as $id) {
      if (trim($id) == '')
        continue;
      delete_post($id);
      load_posts();
    }
  } else {
    delete_post($_GET['delete']);
  }
  //load_posts();
  Header('Location:post.php?done=true&state='.$state);
  exit();
}

先创建一篇测试文章,它会随机生成一个文件名,通过路由定义我们可以构造

payload:

/mc-admin/post.php?state=delete&delete=eipbzu

image-20211116005450602

XSS

创建测试文章,访问弹窗

image-20211116005025100

源码:

 <textarea id="editor" name="content" class="edit_textarea"><?php echo htmlspecialchars($content); ?></textarea>

未对content内容进行转义,同样在配置界面也存在存储型xss

总结

由于这个cms没有使用到数据库且功能较为简单,所以审计出来的东西不多,当然自己太菜也是原因,不过最重要的目的是熟悉MVC框架的构造,对Web server的后台处理有一个基本了解,以此来作为代码审计的入门想来也是不错的。

参考链接:

https://blog.dyboy.cn/websecurity/61.html

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snakin_ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值