FastAdmin前台文件上传
漏洞通告
FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。
2021年3月28日,360漏洞云漏洞研究员发现,FastAdmin框架存在有条件RCE漏洞,当攻击者具有一定用户权限的前提下,可以实现任意文件上传,导致RCE。--360漏洞云
漏洞危害范围:< V1.2.0.20210401_beta
漏洞分析
由于FastAdmin的前台文件上传功能中提供了分片传输功能, 但在合并分片文件时因对文件路径的拼接处理不当导致可上传任意文件。
限制条件:
- 具有上传权限的账户
- 开启分片传输功能(默认关闭)

漏洞文件位于:application/api/controller/Common.php
在上传文件时如果POST传递 chunkid参数即可进行分片文件传输, 其会调用 Upload#chunk方法, 参数均可控。

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

上传测试:

分片文件路径:

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

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


修复方法
- 关闭分片传输功能
- 对 chunked 做正则判断
