[代码审计]eyoucms前台未授权任意文件上传
0x00 背景
来公司差不多一年了,然而我却依旧没有转正。约莫着转正也要到九月了,去年九月来的,实习,转正用了一年。2333
废话不多说了,最近有其他的事要忙,很久没有代码审计了。难的挖不了,浅的没意思。那就随便选吧。
在A5找了套源码,找找感觉。花了十来分钟审了一下,发现了个未授权任意文件上传。
0x01 总体了解
版本: v 1.1.3
框架: tp 5.0
目录如下:

挺标准的tp二次开发目录,直接看application目录下的。

外面的几个php文件就不解释了。粗略的看了一下配置文件和路由。

全局过滤用了strip_sql加htmlspecialchars,tp5默认是走pdo的。除非不是故意留的坑,都不太可能会出现比较容易利用的注入点。
application里面有多个模块。主要是admin,api,common,home四个。
admin 顾名思义是后台处理的 api 是一些接口 common 是基础类。 home 是前端
0x02 发现任意文件上传的接口
看了一下common和api两个模块,在api里面发现了这么一个接口。
看到文件application\api\Uploadify.php
public function preview(){
// 此页面用来协助 IE6/7 预览图片,因为 IE 6/7 不支持 base64
$DIR = 'preview';
// Create target dir
if (!file_exists($DIR)) {
@mkdir($DIR);
}
$cleanupTargetDir = true; // Remove old files
$maxFileAge = 5 * 3600; // Temp file age in seconds
if ($cleanupTargetDir) {
if (!is_dir($DIR) || !$dir = opendir($DIR)) {
die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');
}
while (($file = readdir($dir)) !== false) {
$tmpfilePath = $DIR . DIRECTORY_SEPARATOR . $file;
// Remove temp file if it is older than the max age and is not the current file
if (@filemtime($tmpfilePath) < getTime() - $maxFileAge) {
@unlink($tmpfilePath);
}
}
closedir($dir);
}
//前面的一大串,不用关注,看下面的就行了
$src = file_get_contents('php://input');
if (preg_match("#^data:image/(\w+);base64,(.*)$#", $src, $matches)) {
$previewUrl = sprintf(
"%s://%s%s",
isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
$_SERVER['HTTP_HOST'],$_SERVER['REQUEST_URI']
);
$previewUrl = str_replace("preview.php", "", $previewUrl);
$base64 = $matches[2];
$type = $matches[1];
if ($type === 'jpeg') {
$type = 'jpg';
}
$filename = md5($base64).".$type";
$filePath = $DIR.DIRECTORY_SEPARATOR.$filename;
if (file_exists($filePath)) {
die('{"jsonrpc" : "2.0", "result" : "'.$previewUrl.'preview/'.$filename.'", "id" : "id"}');
} else {
$data = base64_decode($base64);
file_put_contents($filePath, $data);
die('{"jsonrpc" : "2.0", "result" : "'.$previewUrl.'preview/'.$filename.'", "id" : "id"}');
}
} else {
die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "un recoginized source"}}');
}
}
这是一个图片预览的接口,通过php://input接收图片base64编码数据,然后解码,写入文件。返回图片路径。

正则获取了图片的后缀之后,简单判断了一下就没有下文了。然后将获取到的文件后缀,与base64文件数据的md5值拼接成为文件名。最后解码数据,写入。返回路径

追溯一下这个api是否需要登录?(=>等于extends)
app\api\controller\Uploadify =>app\api\controller\Base => app\common\controller\Common =>think\Controller
看了一下没有发现有判断权限或认证的代码,在 app\api\controller\Base 类里面看到似乎是权限判断的代码:

但这里的代码都是空的。。。
那么,整个漏洞的利用逻辑就是往http://www.example.com/index.php/api/Uploadify/preview 打一个base64的post数据包。

漏洞原理很简单。我想这里会出现这么一个问题,大概是作者认为data:image/ 这样的数据,只能是图片?
0x03 漏洞影响
在官网下了一个1.0版本的,对比了一下发现,1.0版本也是存在该漏洞。左1.1.3 ,右1.0

这里的差异只是我添加的一个备注。

昨晚用fofa跑了一下,发现存在该漏洞的网站有50%以上。
0x04 漏洞修复建议
使用白名单判断文件后缀名。
在Uploadify.php中213行到214行的代码修改为如下:
if ($type !== 'jpeg' || $type !=='png' || $type !=='gif' || $type!=='jpg') {
exit();
}
if ($type === 'jpeg') {
$type = 'jpg';
}
0x05 总结
搜了一下这个CMS的历史漏洞,发现只有seebug上面的一个后台任意文件读取漏洞。这个洞藏了很久啊。。
整个漏洞很简单,写篇文章记录一下,除除博客上面的草。
之后想总结一下tp框架二次开发CMS的奇葩漏洞,不知道什么时候能总结出来。。
声明:本文章只用于学习研究之用,禁止用于违法犯罪。
[代码审计]eyoucms前台未授权任意文件上传的更多相关文章
- 代码审计之XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)
0x00 前言 这段时间就一直在搞代码审计了.针对自己的审计方法做一下总结,记录一下步骤. 审计没他,基础要牢,思路要清晰,姿势要多且正. 下面是自己审计的步骤,正在逐步调整,寻求效率最高. 0x01 ...
- 【代码审计】QYKCMS_v4.3.2 任意文件上传漏洞分析
0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...
- 【代码审计】CLTPHP_v5.5.3 前台任意文件上传漏洞分析
0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chich ...
- 【代码审计】CLTPHP_v5.5.3 前台任意文件上传漏洞
0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...
- [代码审计]XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)
0x00 前言 这段时间就一直在搞代码审计了.针对自己的审计方法做一下总结,记录一下步骤. 审计没他,基础要牢,思路要清晰,姿势要多且正. 下面是自己审计的步骤,正在逐步调整,寻求效率最高. 0x01 ...
- 【代码审计】JTBC(CMS)_PHP_v3.0 任意文件上传漏洞分析
0x00 环境准备 JTBC(CMS)官网:http://www.jtbc.cn 网站源码版本:JTBC_CMS_PHP(3.0) 企业版 程序源码下载:http://download.jtbc. ...
- PHP代码审计笔记--任意文件上传
0x01 最简单的文件上传 未进行文件类型和格式做合法性校验,任意文件上传 漏洞代码示例: 新建一个提供上传文件的 upload.html <html> <body> < ...
- [红日安全]Web安全Day5 - 任意文件上传实战攻防
本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...
- WebLogic 两处任意文件上传漏洞动态分析(CVE-2018-2894)
0x01 前言 CNCERT前几天发公告称发现Oracle公司出品的基于JavaEE结构的中间件WebLogic产品存在一个远程上传漏洞,并得到了厂商的确认,危害程度评分高达9.8分.鉴于厂商已进行了 ...
随机推荐
- kubespray 一键安装k8s集群
1. clone代码 git clone https://github.com/kubernetes-incubator/kubespray.git 2. 添加inventory/inventory ...
- sqlserver收缩日志的几种方式
sqlserver收缩日志的几种方式 [sql] --参考 压缩日志及数据库文件大小 /*--特别注意 请按步骤进行,未进行前面的步骤,请不要做后面的步骤 否则可 ...
- 使用Arraylist将数组中元素随机均等乱序分为N个子数组
使用Arraylist将数组中元素随机均等乱序分为N个子数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 为了将数组中的元素 随机地 ,均等地, 不重复地 ,划分到N个子数组中 使用Arr ...
- bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)
http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...
- 转----MarkdownPad2.5 注册码
经测试可用 User: Soar360@live.com 授权: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2 ...
- 那些年实用但被我忘掉javascript属性.onresize
//获取屏幕宽度并动态赋值 var winWidth = 0; var winHeight = 0; function findDimensions() //函数:获取尺寸 { //获取窗口宽度 if ...
- 关于升级程序版本时version与build修改的问题
CHENYILONG Blog 关于升级程序版本时version与build修改的问题 #问题#从V1.0升级到V1.0.1.version是一定要改的,那么build需要修改吗? #解答#一般习惯上 ...
- 使用storyboard显示UITableView时,如果不修改系统默认生成的tableView:cellForRowAtIndexPath:方法中的代码,则必须为UITableViewCell注册(填写)重用标识符:identifier.必须要代码方法中的标识符一致.
CHENYILONG Blog 使用storyboard显示UITableView时,如果不修改系统默认生成的tableView:cellForRowAtIndexPath:方法中的代码,则必须为UI ...
- HDU 1241 Oil Deposits DFS搜索题
题目大意:给你一个m*n的矩阵,里面有两种符号,一种是 @ 表示这个位置有油田,另一种是 * 表示这个位置没有油田,现在规定相邻的任意块油田只算一块油田,这里的相邻包括上下左右以及斜的的四个方向相邻的 ...
- 【CTF WEB】函数绕过
函数绕过 <?php show_source(__FILE__); $c = "<?php exit;?>"; @$c.=$_GET['c']; @$filena ...