FastAdmin前台文件上传

漏洞通告

FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。

2021年3月28日,360漏洞云漏洞研究员发现,FastAdmin框架存在有条件RCE漏洞,当攻击者具有一定用户权限的前提下,可以实现任意文件上传,导致RCE。--360漏洞云

漏洞危害范围:< V1.2.0.20210401_beta

漏洞分析

由于FastAdmin的前台文件上传功能中提供了分片传输功能, 但在合并分片文件时因对文件路径的拼接处理不当导致可上传任意文件。

限制条件:

  • 具有上传权限的账户
  • 开启分片传输功能(默认关闭)

image-20210402153325199

漏洞文件位于:application/api/controller/Common.php

在上传文件时如果POST传递 chunkid参数即可进行分片文件传输, 其会调用 Upload#chunk方法, 参数均可控。

image-20210402153625520

一起梳理一下chunk方法, 代码不多, 一行一行作解释。首先判断 Content-Type不为 application/obtet-stream则抛出 UploadException异常。接着会拼接分片文件存储路径为 runtime/chunks。文件名为 $chunkid + - + $chunkindex + .part。即当我们传递 $chunkidhhh.php, $chunkindex为0, 则拼接出的分片文件名为 hhh.php-0.part

image-20210402154305757

上传测试:

image-20210402154243269

分片文件路径:

image-20210402154428710

回到 upload方法, 当 $actionmerge时会调用 Upload#merge方法合并分片文件, 首先其将分片文件路径和 $chunkid拼接, 然后合并所有分片文件。

image-20210402155146031

调用 merge方法合并分片文件:

image-20210402155349851

image-20210402155518932

修复方法

  1. 关闭分片传输功能
  2. 对 chunked 做正则判断

image-20210402155956334

参考

FastAdmin最新RCE漏洞复现