简介
漏洞详情
影响版本
V1.0.0.20180911_beta - V1.0.0.20200506_beta
这里使用的是 V1.0.0.20200506_beta版本复现
漏洞分析
漏洞利用条件: usercenter=>true
漏洞形成文件: application/index/controller/User.php
_empty函数接收$name遍历,直接将$name返回视图中:return $this->view->fetch($name);攻击者可通过上传文件,例如图片,传入$name,fetch模板进行php模板解析,导致getshell。
thinkphp/library/think/view/driver/Think.php中的渲染fetch实际使用的是thinkphp的解析模板函数,内容如下:
在验证是否为模板文件时,可以看到 if(!is_file($temple)), 来判断是否存在,如果存在则将文件当成php进行解析
if_file 判断给定文件名是否为一个正常的文件,详细的关于 if_file() 函数可以参考一下
https://www.php.net/manual/zh/function.is-file.php
不同操作系统解析文件路径的时候,linux和windows 的 if_file() 函数实现起来会不一样
1、linux判断is_file() /demo/../../../../test 如果demo目录不存在,就会返回false;
windows则无论这个目录是否存在,均会返回true;
2、在linux下,is_file()函数判可用于判断符号链接
3、在linux下,is_file函数会受到权限的影响,当前用户权限不足或父目录没有设置+x权限时,is_file()会返回false
4、windows系统里面/和\ 都可以使用,但是在linux下只能使用/ 来分隔路径,因此这会导致is_file()在不同系统下的返回结果不一致
5、is_file()判断文件时,如果文件大小超过2^32时,会判断失败(PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果)
漏洞复现
1.首先在页面注册处创建一个用户,然后修改个人资料
2.进入个人资料处,点击编辑头像功能,并上传一张图片马
图片马的制作: copy 1.png/b+4.php/a 123.png
3.构造poc,/index/user/_empty?name=../../public/uploads/路径.png
http://127.0.0.1/FastAdmin_v1.0.0506/public/index/user/_empty?name=../../public/uploads/20210401/15502341dd7408f449a3be262e800084.png
4.成功将png文件当成php文件解析,也可以写入一句话木马然后getshell
漏洞修复
1.去官网下载最新的版本,该漏洞已成功修复
2.还有一种方法
打开application/index/controller/User.php,找到大概第58行的_empty方法,有以下两种修复方法:
一种修复方法是直接移除_empty方法
另一种是将_empty方法改为
public function _empty($name)
{
if (!preg_match("/^([a-z0-9_]+)$/i", $name)) {
$this->error(__(‘Invalid parameters‘));
}
$data = Hook::listen("user_request_empty", $name);
foreach ($data as $index => $datum) {
$this->view->assign($datum);
}
return $this->view->fetch(‘user/‘ . $name);
}
知识星球
知识星球:安全资源圈
星球福利:
立志做xdm的白嫖基地
星球包含:
1.最新0/1/nday漏洞分享
2.最新工具分享
3.各类实用文章
4.cnvd证书获取途径
5.各类poc/exp
6.内部福利活动,包含众测项目等
.....
立志做圈子内的白嫖基地
免责声明
本公众号文章以技术分享学习为目的。
由于传播、利用本公众号发布文章而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任。 一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!