FastAdmin前台文件上传
字数 1131 2025-08-05 13:25:37

FastAdmin前台文件上传漏洞分析及利用教学文档

漏洞概述

FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。2021年3月28日,360漏洞云漏洞研究员发现FastAdmin框架存在有条件RCE漏洞,当攻击者具有一定用户权限的前提下,可以实现任意文件上传,导致远程代码执行(RCE)。

漏洞影响范围

FastAdmin版本 < V1.2.0.20210401_beta

漏洞条件

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

漏洞位置

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

漏洞原理分析

分片上传机制

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

关键代码流程

  1. 上传文件时如果POST传递chunkid参数即可进行分片文件传输
  2. 系统会调用Upload#chunk方法,参数均可控

chunk方法分析

  1. 首先检查Content-Type是否为application/obtet-stream,否则抛出UploadException异常
  2. 拼接分片文件存储路径为runtime/chunks
  3. 文件命名格式为:$chunkid + "-" + $chunkindex + ".part"
    • 例如:传递$chunkidhhh.php$chunkindex为0,则分片文件名为hhh.php-0.part

merge方法分析

  1. $actionmerge时会调用Upload#merge方法合并分片文件
  2. 将分片文件路径和$chunkid拼接
  3. 合并所有分片文件

漏洞利用步骤

  1. 准备一个恶意PHP文件(如webshell)
  2. 将文件分片上传:
    • 设置chunkid为恶意文件名(如shell.php
    • 设置chunkindex为分片序号
  3. 调用merge方法合并分片文件
    • 由于路径拼接不当,最终会在web目录生成可执行的PHP文件

漏洞利用脚本

参考FastAdmin_Upload漏洞利用脚本(具体脚本内容未在原文中详细给出)

修复方案

  1. 关闭分片传输功能(如果不需要)
  2. chunkid参数做严格的正则判断,防止恶意文件名
    • 例如限制只能包含字母、数字和特定安全字符
    • 禁止包含特殊字符和文件扩展名

防御建议

  1. 及时升级到修复版本(V1.2.0.20210401_beta或更高)
  2. 实施最小权限原则,严格控制文件上传权限
  3. 对上传文件进行严格的类型检查和内容验证
  4. 将上传文件存储在非web可访问目录,或配置服务器禁止执行上传目录中的脚本
FastAdmin前台文件上传漏洞分析及利用教学文档 漏洞概述 FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。2021年3月28日,360漏洞云漏洞研究员发现FastAdmin框架存在有条件RCE漏洞,当攻击者具有一定用户权限的前提下,可以实现任意文件上传,导致远程代码执行(RCE)。 漏洞影响范围 FastAdmin版本 < V1.2.0.20210401_ beta 漏洞条件 具有上传权限的账户 开启分片传输功能(默认关闭) 漏洞位置 漏洞文件位于: application/api/controller/Common.php 漏洞原理分析 分片上传机制 FastAdmin的前台文件上传功能提供了分片传输功能,但在合并分片文件时对文件路径的拼接处理不当,导致可以上传任意文件。 关键代码流程 上传文件时如果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 merge方法分析 当 $action 为 merge 时会调用 Upload#merge 方法合并分片文件 将分片文件路径和 $chunkid 拼接 合并所有分片文件 漏洞利用步骤 准备一个恶意PHP文件(如webshell) 将文件分片上传: 设置 chunkid 为恶意文件名(如 shell.php ) 设置 chunkindex 为分片序号 调用merge方法合并分片文件 由于路径拼接不当,最终会在web目录生成可执行的PHP文件 漏洞利用脚本 参考FastAdmin_ Upload漏洞利用脚本(具体脚本内容未在原文中详细给出) 修复方案 关闭分片传输功能(如果不需要) 对 chunkid 参数做严格的正则判断,防止恶意文件名 例如限制只能包含字母、数字和特定安全字符 禁止包含特殊字符和文件扩展名 防御建议 及时升级到修复版本(V1.2.0.20210401_ beta或更高) 实施最小权限原则,严格控制文件上传权限 对上传文件进行严格的类型检查和内容验证 将上传文件存储在非web可访问目录,或配置服务器禁止执行上传目录中的脚本