前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fastadmin最新版前台getshell漏洞分析

fastadmin最新版前台getshell漏洞分析

作者头像
p4nda
发布2023-01-03 14:17:36
7.6K0
发布2023-01-03 14:17:36
举报
文章被收录于专栏:技术猫屋技术猫屋

影响版本

V1.0.0.20200506_beta(最新版)

利用限制

/application/config.php 文件中:

代码语言:javascript
复制
    //是否开启前台会员中心
    'usercenter'            => true,

即需要开启会员中心功能

漏洞分析

/application/index/User.php文件

第58-67行:

代码语言:javascript
复制
 public function _empty($name)
    {    
        $data = Hook::listen("user_request_empty", $name);
            foreach ($data as $index => $datum) {
            $this->view->assign($datum);
            }
    return $this->view->fetch($name);
}

user_request_empty为开发者预留的钩子可以忽视不看,主要看 return this->view->fetch(

此方法中的name参数可控,并且将name的值传入到了fecth()函数中。

fetch()为thinkphp的解析模板函数,其返回模板文件渲染后的内容

fetch()函数的关键内容如下:

代码语言:javascript
复制
  public function fetch($template, $data = [], $config = [])
    {
        if ('' == pathinfo($template, PATHINFO_EXTENSION)) {
            // 获取模板文件名
            $template = $this->parseTemplate($template);
        }
        // 模板不存在 抛出异常
        if (!is_file($template)) {
            throw new TemplateNotFoundException('template not exists:' . $template, $template);
        }
        // 记录视图信息
        App::$debug && Log::record('[ VIEW ] ' . $template . ' [ ' . var_export(array_keys($data), true) . ' ]', 'info');
        $this->template->fetch($template, $data, $config);
    }

继续调用栈可以看下其实这个fetch()函数调用的是内置模板引擎的fetch方法, 这个方法实际上就是将要输出的页面内容赋值给一个变量,为了方便,thinkphp在对模板渲染的过程中,添加了php标签功能,使得其可以解析php代码。

总之一句话,这个漏洞其实就是由于对传入变量过滤不严导致的模板引擎注入漏洞,只要控制了传入模板的文件,就可以利用模板本身的渲染功能,实现包含漏洞getshell

另外需要注意的是,当验证传入的模板是否是文件时,使用的is_file()函数,这个函数在Linux下和windows下的判断会有所不同,具体如下:

1、在linux下利用is_file()来判断类似于/****/../../../../etc/passwd文件时,如果****是不存在的目录,则会返回false,在windows下 ,这个目录存在与否,均返回true,如下图所示:

1.png
1.png
2.png
2.png

2、在linux下,is_file()函数判可用于判断符号链接

3、在linux下,is_file函数会受到权限的影响,当前用户权限不足或父目录没有设置+x权限时,is_file()会返回false

4、windows系统里面/\ 都可以使用,但是在linux下只能使用/ 来分隔路径,因此这会导致is_file()在不同系统下的返回结果不一致

3.png
3.png
4.png
4.png

5、is_file()判断文件时,如果文件大小超过2^32时,会判断失败

漏洞验证

通过前文可知,这个漏洞的利用点在_empty()函数,需要注意的是,在官方文档中通常_empty()方法是用来判断一个方法是否存在,如果不存在,则进入该函数。而这里是开发者自定义的方法,因此直接传入_empty方法,调用name参数即可。

利用过程如下:

在前台的会员中心,个人资料处,上传修改头像:

5.png
5.png

抓包后修改图片数据(满足图片头格式即可):

6.png
6.png

记录下路径后,成功getshell

7.png
7.png

在Linux下,通过这种方法会失效,因为在/public路径下不存在user目录,由前文中的知识点可以知道,当不存在这个目录的时候,无论怎么跳转目录,is_file()函数返回的结果始终未false,因此无法利用该漏洞,如下图所示:

8.png
8.png

当我们在/public目录下创建文件夹/user,在利用,即可成功:

9.png
9.png

最后感谢joseph师傅,又学习了一波

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 影响版本
  • 利用限制
  • 漏洞分析
  • 漏洞验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档