0x01 简介
FastAdmin是一款基于ThinkPHP5+Bootstrap开发的极速后台开发框架。FastAdmin基于Apache2.0开源协议发布,目前被广泛应用于各大行业应用后台管理。
影响版本:V1.0.0.20180911_beta - V1.0.0.20200506_beta
这里使用使用 V1.0.0.20200506_beta版本复现

0x02 漏洞分析
漏洞利用条件:usercenter=>true
漏洞文件:applicationindexcontrollerUser.php

65195-z943wadzw6m.png

_empty函数接收$name遍历,直接将$name返回视图中:return $this->view->fetch($name);
攻击者可通过上传文件,例如图片,传入$name,fetch模板进行php模板解析,导致getshell。
thinkphplibrarythinkviewdriverThink.php中的渲染fetch实际使用的是thinkphp的解析模板函数,内容如下:

53641-cgzugnuma5o.png

在验证是否为模板文件,可以看到if (!is_file($template)) ,来判断是否存在,如果存在就将文件进行php解析。
关于is_file()函数,可以参考:https://www.php.net/manual/zh/function.is-file.php
不同操作系统解析文件路径的时候,linux和windwos is_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 以上的文件,一些文件系统函数可能返回无法预期的结果)

0x03 漏洞利用
首先在前台创建一个用户,然后修改个人资料,上传一张图片马

50919-ng9h969opm.png

使用注册的账户登录,点击会员中心个人资料处,上传一个jpg图片马

42854-sj0kgh2hzv.png

54391-n4jg30de0vt.png

3、构造POC,GET /index/user/_empty?name=../../public/uploads/路径.jpg

http://192.168.1.102/fastadmin/public/index/user/_empty?name=../../public/uploads/20210117/b222800a0a54947d51043dc200db78a4.jpg

21386-996gt8w3go.png

漏洞修复
目前官网下载的已更新,漏洞修复了
修复方案
打开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);
    }

本文由 wulaoban 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论